如何从服务器检索值并将其保存在sqlite中并立即显示?

时间:2016-03-10 06:22:27

标签: android sqlite android-volley

我有一个疑问是使用凌空从服务器获取记录并将其保存在sqlite中并通过查询getlist设置适配器但是它不会立即显示结果我需要返回并再次查看新更新的数据如何在sqlite中插入后立即显示记录让我发布我的代码:

以下是从服务器获取记录的截击代码:

  JsonObjectRequest jsonObjRequest = new JsonObjectRequest(Request.Method.GET, params[0], new JSONObject(),
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        String server_response = response.toString();
                        try {
                            JSONObject json_object = new JSONObject(server_response);
                            JSONArray json_array = new JSONArray(json_object.getString("AccountPageLoadAccountListResult"));
                            for (int i = 0; i < json_array.length(); i++) {
                                Model_Account modelobjs = new Model_Account();
                                JSONObject json_arrayJSONObject = json_array.getJSONObject(i);
                                modelobjs.setCompany_group(json_arrayJSONObject.getString("CompanyName"));
                                modelobjs.setState(json_arrayJSONObject.getString("Region"));
                                account_sf_db.InsertorUpdate(modelobjs);


                            }
                        }  catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getBaseContext(), error.toString(), Toast.LENGTH_SHORT).show();

                    }
                });
        queue.add(jsonObjRequest);

这是从sqlite android设置适配器的适配器:

  List<ModelClass>listobj=new Arraylist<Modelclass>();
     listobj=account_sf_db.list();
      accountListAdapter = new AccountListAdapter(listobj, getApplicationContext());
recyclerView.setAdapter(accountListAdapter);

这样做的目的是即使在离线时也能处理离线功能,我们必须使用sqlite

来访问它

4 个答案:

答案 0 :(得分:4)

在Sqlite中创建数据库表时,需要添加一个notifyChange,其中包含与数据库表关联的URI。

以下是我在代码中执行此操作的示例。

我必须为我的数据库表声明一个URI:

// These are just some constants
public static final String DB_NAME = "mydatabase";
private static final int DATABASE_VERSION = 1;
public static final String ApplicationPackage = "com.example.myapp";
public static final String DB_TABLE_ACCOUNTS = "accounts";

// This is the URI of the database table
public static final Uri DB_TABLE_ACCOUNTS_URI = Uri
            .parse("sqlite://" + Constants.ApplicationPackage + "/" + DB_TABLE_ACCOUNTS);

现在,当我使用函数创建数据库表条目时,该函数看起来像这样。

public void createAccounts(Account mNewAccount) {
    SQLiteDatabase db = null;

    try {
        DataBaseOpenHelper dOpenHelper;
        dOpenHelper = new DataBaseOpenHelper(context,DB_NAME,DATABASE_VERSION);

        ContentValues values = new ContentValues();
        values.put("account_name", mNewAccount.getAccountName());
        values.put("account_number", mNewAccount.getAccountNumber());
        db = dOpenHelper.getWritableDatabase();
        db.insert(DBConstants.DB_TABLE_ACCOUNTS, null, values);

        // Here you notify the change when the database is updated
        context.getContentResolver().notifyChange(DB_TABLE_ACCOUNTS_URI, null);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

现在这里是 DataBaseOpenHelper.java

public class DataBaseOpenHelper extends SQLiteOpenHelper {

    private int newVersion;
    private String name;

    public DataBaseOpenHelper(Context context, String name, int version) {
        super(context, name, null, version);
        this.newVersion = version;
        this.name = name;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("create table if not exists "
                + DBConstants.DB_TABLE_ACCOUNTS
                + "(_id integer primary key autoincrement, account_number text not null, "
                + "account_name text)");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

现在,如果您使用Activity这样的Fragment,则需要registerContentOberveronCreateLoader中的LoaderManager.LoaderCallBacks<Cursor>查询数据库表:

Cursor cursor = DataHelper.getInstance(getActivity()).getAccounts();
this.registerContentObserver(cursor, DB_TABLE_ACCOUNTS_URI);

因此,当您从服务器返回响应时,需要从Sqlite数据库再次加载数据以重新初始化listobj。然后拨打accountListAdapter.notifyDataSetChanged()

答案 1 :(得分:2)

在适配器中添加方法

public void addModelClass(ModelClass modelClass){
listobj.add(modelClass);
notifyDataItemInserted(listobj.size()-1);
}

然后在volley onResponse中在sqlite insert

之后调用此函数
accountListAdapter.add(modelobj);

答案 2 :(得分:0)

您可以将cursor loaderContent provider一起使用来实现此目的。

答案 3 :(得分:0)

accountListAdapter.notifyDataSetChanged();

只需调用此方法并查看结果。