4

50 ~ 500 件の連絡先情報をデータベースに挿入する必要があります。image、name、number、bool 変数をそれぞれ含む 4 つの arraylists があります。

データの各行は、4 つのアレイリストすべてと SNO の組み合わせで構成されています。下の画像を参照してください。

ここに画像の説明を入力

私の質問は、ユーザーの連絡先リストから取得した 500 の連絡先があるとしましょう。一度に各行をテーブルに挿入し、それを 500 回呼び出す関数があるのは良いことですか? または他の方法はありますか?平均的なアイデアは、すべての配列リストを結合し、それを関数に渡し、そこでデータを取得して、insert ステートメントを 500 回繰り返すことです。

性能的にはどちらが良いですか?

for(int i =0; i < 500; i++)
{
  dbObj.insert_row(par1, par2, par3, par4, ...);
}

また

function insert_row(Combined ArrayLists)
{
  for(int i=0; i<500; i++)
  {
    db.execSql(//Insert Statement);
  }
}
4

4 に答える 4

6

データベースにデータを挿入する - それを行う最良の方法は何ですか

オブジェクトのプロパティがテーブルの列と等しくなるテーブルを表す独自のオブジェクトを作成することをお勧めします。

public class Contact {

   private String name;
   private String number;
   private String image;
   private boolean conn;

   //getters and setters
}

あなたのアプローチは「スパゲッティコード」のように聞こえます。ArrayList を 4 つ持つ必要はなく、この設計は効率的で正しくありません。

これで、500 個の子を持つ Contact オブジェクトの ArrayList が 1 つできました。

挿入する最良の方法は何ですか?

確かに、挿入をTRANSACTION迅速に高速化するものに挿入をラップすると、データベースを扱う主なものがはるかに安全になり、データベースの整合性が失われる可能性を気にする必要がなくなります。

トランザクションの例 (私の個人的なサンプル プロジェクトからの 1 つの方法):

public boolean insertTransaction(int count) throws SQLException {
    boolean result = false;
    try {
        db = openWrite(DataSource.getInstance(mContext));
        ContentValues values = new ContentValues();
        if (db != null) {
            db.beginTransaction();
            for (int i = 0; i < count; i++) {
                values.put(SQLConstants.KEY_TYPE, "type" + i);
                values.put(SQLConstants.KEY_DATE, new Date().toString());
                db.insertOrThrow(SQLConstants.TEST_TABLE_NAME, SQLConstants.KEY_TYPE, values);
                values.clear();
            }
            db.setTransactionSuccessful();
            result = true;
        }
        return result;
    }
    finally {
        if (db != null) {
            db.endTransaction();
        }
        close(db);
    }
}
于 2013-04-12T18:13:45.250 に答える
0

前に述べたように、1 つの行を表す独自のクラスを作成するか、ContentValues クラスを使用 します

このリンクで説明されている方法を使用する場合は、関数を作成してこのクエリを生成し、一度だけ実行することをお勧めします。そうでなければ、他の人がすでに述べたように、トランザクションを使用して多くの挿入のパフォーマンスを向上させることができます。

于 2013-04-12T18:23:05.013 に答える
0

4 つの配列を 1 つのオブジェクト配列に変換すると、コードが改善されます。しかし、このようにしなくてもこれらのオブジェクトを作成できます。

バインド変数 (? または :vars) を使用して sql ステートメントを準備し、各行にバインド変数を設定してループ内でステートメントを複数回実行します。

String sql = "insert into..... values (?,?,?,?)";
// Get connection etc
PreparedStatement stmt = conn.prepareStatement(sql);
for(int i =0; i < 500; i++)
{
   stmt.setString(1, name.get(i));
   stmt.setNumber(2, number.get(i));
   ...

   stmt.executeUpdate();
}
于 2013-04-12T18:12:43.247 に答える