簡體   English   中英

使用SQLite將JSON值從Web服務器存儲到數據庫中

[英]Storing JSON values from a webserver into a database with SQLite

在我的應用程序中,我已經從JSON響應中檢索了一些數據。 我也可以顯示它們。

       @Override
       public void onResponse(JSONArray response) {
           Log.d("Theo", response.toString());
           //I use i=1 to bypass the first JSON object which doesn't contain the object member.
           //If i set i=0,then I will get an exception.
           for(int i = 1;i<response.length();i++){


               try {

                   //Here I read the 4 objects.
                   JSONObject jsonObject = response.getJSONObject(i);

                       //I get the members array for JSON object
                       JSONArray teamMembersArray = jsonObject.getJSONArray("members");


                       for(int j=0;j<teamMembersArray.length();j++) {

                           //The model class which contains the setters/getters
                           //in order to "deserialize" the JSON objects into string objects.
                           Model m = new Model();


                           JSONObject teamObject = teamMembersArray.getJSONObject(j);
                           //I am searching if the teamLead object exists.If yes
                           //then set it to true by reading it! If not then read
                           //the next members!
                          if (teamObject.has("teamLead") && (!teamObject.isNull("teamLead")))  {
                               m.setTeamLead(teamObject.getBoolean("teamLead"));
                           }else {
                               //Default value
                               m.setTeamLead(false);

                           }
                           m.setId(teamObject.getInt("id"));
                           m.setProfileImageURL(teamObject.getString("profileImageURL"));
                           m.setFirstName(teamObject.getString("firstName"));
                           m.setLastName(teamObject.getString("lastName"));
                           m.setRole(teamObject.getString("role"));

                           //Finally I am adding the string objects into an ArrayList.
                           modelArrayList.add(m);

                           int id = Integer.parseInt(teamObject.getString("id"));
                           String fname = teamObject.getString("firstName");
                           String lname = teamObject.getString("lastName");
                           String role = teamObject.getString("role");
                           String proImage = teamObject.getString("profileImageURL");
                           saveToDB(id,fname,lname,role,proImage);
                       }
               } catch (JSONException e) {
                   e.printStackTrace();
               }

           }

saveToDB方法是

  private void saveToDB(int id,String firstName,String lastName,String role,String image){

    //myMovie.setContent(descriptionText.getText().toString());

    dba.addMembers(id,firstName,lastName,role,image);
    dba.close();

}

下一步是在沒有Internet連接的情況下使用SQLite進行存儲。 因此,我首先從響應中獲取字符串(從JSON轉換而來)。

  int id = Integer.parseInt(teamObject.getString("id"));
                       String fname = teamObject.getString("firstName");
                       String lname = teamObject.getString("lastName");
                       String role = teamObject.getString("role");
                       String proImage = teamObject.getString("profileImageURL");
                       saveToDB(id,fname,lname,role,proImage);

然后使用將它們傳遞到DatabaseHandler類的名為addMembers(...)的方法中。

public class DatabaseHandler extends SQLiteOpenHelper {
private final ArrayList<SQLiteModel> membersList = new ArrayList<>();
public DatabaseHandler(Context context) {
    super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_TEST_TABLE = "CREATE TABLE " + Constants.TABLE_NAME +
            "(" + Constants.MEMBER_ID + " INTEGER PRIMARY KEY, " + Constants.FIRST_NAME +
            " TEXT, "  +  Constants.LAST_NAME + " TEXT, " + Constants.JOB_ROLE + " TEXT, " +
            Constants.PROFILE_IMAGE + " TEXT);";
    db.execSQL(CREATE_TEST_TABLE);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + Constants.TABLE_NAME);
}
//add content to table
public void addMembers(int id,String firstName,String lastName,String role,String image) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(Constants.MEMBER_ID,id);
    values.put(Constants.FIRST_NAME, firstName);
    values.put(Constants.LAST_NAME,lastName);
    values.put(Constants.JOB_ROLE,role);
    values.put(Constants.PROFILE_IMAGE,image);





    db.insert(Constants.TABLE_NAME, null, values);

    db.close();

    Log.v("DB","heeeey!data saved");
}

//get all folders
public ArrayList<SQLiteModel> getMembersDetails() {
   //I am stuck in this part. Boolean variables are not recognized
   //in SQLite. So I have to make the getTeamLead() method from
   //Model class,to return an int. But this will mess up my
   //my recycler view.


    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(Constants.TABLE_NAME, new String[]{
            Constants.MEMBER_ID, Constants.FIRST_NAME,Constants.LAST_NAME,Constants.JOB_ROLE,Constants.PROFILE_IMAGE}, null, null, null, null, Constants.MEMBER_ID + " DESC");


    if (cursor.moveToFirst()) {
        do {

            SQLiteModel sqLiteModel = new SQLiteModel();
            sqLiteModel.setSqlId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(Constants.MEMBER_ID))));

            sqLiteModel.setSqlFirstName(cursor.getString(cursor.getColumnIndex(Constants.FIRST_NAME)));
            sqLiteModel.setSqlLastName(cursor.getString(cursor.getColumnIndex(Constants.LAST_NAME)));
            sqLiteModel.setSqlRole(cursor.getString(cursor.getColumnIndex(Constants.JOB_ROLE)));
            sqLiteModel.setSqlProfileImageURL(cursor.getString(cursor.getColumnIndex(Constants.PROFILE_IMAGE)));


            membersList.add(sqLiteModel);
        }while(cursor.moveToNext());


    }
    return membersList;
}

}

當我運行我的應用程序時,我得到每個條目的logcat輸出。

06-22 07:30:22.831 17732-17732/testing.theo.androidtestproject    
E/SQLiteDatabase: 
Error inserting lastName=Corke firstName=Hannah   
profileImageURL=http://developers.mub.lu/resources/profilePlaceholder.png 
id=24 role=Designer                                                                         
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed:   
testdb.id (code 1555)

任何想法為什么會這樣?

謝謝西奧

您應該使用db.insertWithOnConflict()函數。 在這里檢查文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM