0
私のアプリでは、JSONレスポンスからいくつかのデータを取得しました。私はそれらを表示することもできます。SQLiteを使用してWebサーバーから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();
}
次のステップは、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)
なぜこのようなことが起こりますか?
ありがとうございます。
これは、すでに存在する値を挿入しようとしているためです。つまり、あなたのIDはプライマリキーで、もう一度挿入しようとしています...おそらくあなたのテーブルにID = 24が既に存在している可能性があります。 – SripadRaj
どうすればその例外を回避できますか?私が知っていることは、IDをプライマリとしてデータベースに挿入する必要があることです。もし私がそれを取り除くなら、問題が生じるだろう。 – Theo
[insertWithOnConflict](https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insertWithOnConflict%28java.lang.String,%20java.lang.String,%20android)を使用してください。 .content.ContentValues、%20int%29) – SripadRaj