0

私はAndroidプログラミングに不慣れで、ベストプラクティスを理解しようとしています。

2つの異なるデータベーステーブルに複数の挿入を実行したいのですが、1つのトランザクションとして(テーブルが外部キーを共有しているため)。関数が結果を返し、トーストなどでエラーが発生したことを示すことができるようにしたい。そうでない場合は、最初の挿入の行IDを返したい。

これを行う1つの方法は、次のようなものだと思います(免責事項:疑似的なコード、おそらくコンパイルされません!):

Long result = -1;
myDatabase.beginTransaction();
try {
   // Insert into first table
   ContentValue someValues = new ContentValues();
   someValues.put("dbfield1", 1);
   result = myDatabase.insert(DATABASE_TABLE_1, null, someValues);

   if (-1 != result ) {         
       // Insert into second table
       someValues.clear();
       someValues.put("dbfield2", 2);

       if( myDatabase.insert(DATABASE_TABLE_2, null, someValues) < 0 ) {
           result = -1;
       }
   }

   mDatabase.setTransactionSuccessful();
} catch(Exception e) {
    // An error occurred
    result = -1;
} finally {
   mDatabase.endTransaction();
}

これを行うためのより簡単でより良い方法はありますか?

4

1 に答える 1

1

bulkInsertContentProvider 内でコードをオーバーライドできます。メソッドは挿入された行の値を返す必要がありますが、最初の ID のみを返すようにカスタマイズできます。

public int bulkInsert(Uri uri, ContentValues[] values) {
    Log.e("BULK", "Bulk insert started for URI" + uri.toString());
    bulkSqlDB = database.getWritableDatabase();
    int numInserted;

    bulkSqlDB.beginTransaction();
    try {
        for (ContentValues cv : values) {
            insert(uri, cv);
        }
        bulkSqlDB.setTransactionSuccessful();
        numInserted = values.length;
    } finally {
        getContext().getContentResolver().notifyChange(uri, null);
        bulkSqlDB.endTransaction();
    }
    return numInserted;
}
于 2012-07-31T18:12:33.783 に答える