2017-06-24 136 views
0

我有一個來自網絡的JSON數組調用,並作爲一個設置爲回收視圖適配器的數組列表傳遞,第一個層次結構調用的大小爲4個元素,我想要保存這些元素到只有一列的sqlite數據庫。 JSON調用如下。如何添加JSON數組到Sqlite數據庫在Android中

private void loadJSON(){ 

    Service serviceAPI = Client.getClient(); 
    Call<JsonArray> loadRecipeCall = serviceAPI.readRecipeArray(); 

    loadRecipeCall.enqueue(new Callback<JsonArray>() { 
     @Override 
     public void onResponse(Call<JsonArray> call, Response<JsonArray> response) { 

      try { 

       String recipeString = response.body().toString(); 
       Log.i("onResponse", recipeString); 
       Type listType = new TypeToken<List<Recipe>>() {}.getType(); 
       recipeList = new Gson().fromJson(recipeString, listType); 
       Log.i("onResponse", recipeList.toString()); 

       recyclerView.setAdapter(new RecipeAdapter(getApplicationContext(), recipeList)); 
       recyclerView.smoothScrollToPosition(0); 

      } catch (Exception e) { 
       Log.d("onResponse", "There is an error"); 
       e.printStackTrace(); 
      } 

     } 

     @Override 
     public void onFailure(Call<JsonArray> call, Throwable t) { 

      Log.d("onFailure", t.toString()); 

     } 


    }); 
} 

如何將「List recipeList」保存到SQlite數據庫中基本上我需要insertFunction結構來執行此操作。只有一個食譜名稱列的數據庫是Nuttella Pie,Brownies ......只有recipeList包含的四個名稱。

回答

0

要創建一個數據庫,並添加或獲取任何信息,您需要創建一個擴展SQLiteOpenHelper的類。我根據您的需要編寫了一個示例類:

public class UserDBHelper extends SQLiteOpenHelper { 

private static String column1 = "ID"; 
private static String column2 = "recipe"; 
private static String tableName = "Recipes"; 

private static final String DATABASE_NAME = "TESTINFO.DB"; 
private static final int DATABASE_VERSION = 1; 
private static final String CREATE_QUERY = 
     "CREATE TABLE "+tableName+" (" + column1 + " INTEGER primary key, " + column2 + " TEXT unique);"; 


public UserDBHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    Log.e("Database operations", "Database created or opened..."); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_QUERY); 
    Log.e("Database operations", "Database created..."); 
} 

public void addInformation(String recipe, SQLiteDatabase db) { 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(column2, recipe); 
    db.insertWithOnConflict(tableName, null, contentValues, SQLiteDatabase.CONFLICT_IGNORE) 
    Log.e("Database operations", "One row inserted ..."); 
} 

public Cursor getInformations(SQLiteDatabase db) { 
    Cursor cursor; 
    String[] projections = {column1,column2}; 
    cursor = db.query(
      tableName, 
      projections, 
      null, 
      null, 
      null, 
      null, 
      null 
    ); 

    return cursor; 
} 


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

} 
} 

在活動中,插入你需要一些行添加到您的活動數據:

private void loadJSON(){ 

    Service serviceAPI = Client.getClient(); 
    Call<JsonArray> loadRecipeCall = serviceAPI.readRecipeArray(); 

    loadRecipeCall.enqueue(new Callback<JsonArray>() { 
     @Override 
     public void onResponse(Call<JsonArray> call, Response<JsonArray> response) { 

      try { 

       String recipeString = response.body().toString(); 
       Log.i("onResponse", recipeString); 
       Type listType = new TypeToken<List<Recipe>>() {}.getType(); 
       recipeList = new Gson().fromJson(recipeString, listType); 
       Log.i("onResponse", recipeList.toString()); 

       recyclerView.setAdapter(new RecipeAdapter(getApplicationContext(), recipeList)); 
       recyclerView.smoothScrollToPosition(0); 

       MainActivity.this.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          UserDBHelper userDBHelper = new UserDBHelper(MainActivity.this); 
          SQLiteDatabase sqLiteDatabase = userDBHelper.getWritableDatabase(); 
          foreach(String recipe : recipeList) 
          userDBHelper.addInformation(recipe, sqLiteDatabase); 
          userDBHelper.close(); 
         } 
        }); 

      } catch (Exception e) { 
       Log.d("onResponse", "There is an error"); 
       e.printStackTrace(); 
      } 

     } 

     @Override 
     public void onFailure(Call<JsonArray> call, Throwable t) { 

      Log.d("onFailure", t.toString()); 

     } 


    }); 
} 
+0

謝謝,這幫助了我,並用少量的修改工作。但啓動MainActivity的任何其他時間食譜數據保持加入到sqlite數據庫,我怎樣才能停止多個數據添加到數據庫的行動重新啓動活動 – Delaroy

+0

你需要'insertWithOnConflict'方法......我會編輯我的答案並修復該代碼。請,upvote並接受這個帖子作爲答案,如果它幫助你 – emiraslan

+0

我改變了一點答案。 (請參閱'編輯')。在運行此代碼之前,請確保您已取消防止並安裝應用程序。這是因爲,您需要在更改數據庫之前刪除數據庫。 或者,您可以運行'getApplicationContext()。deleteDatabase(「TESTINFO.DB」)''。但第一種方式會容易得多 – emiraslan

相關問題