2011-08-08 16 views
3

私のアプリでは、しばしばDBのテーブルに多くの値を挿入する必要があります。複数の値を挿入する同じクエリでSQLite androidを使用する

だから私は次のように挿入を実行する必要があるだろう:私は主キー(とクラッシュを回避することができますどのようにそれについて二つの質問(私はSQLでのスターターだ)

  1. を持って

    insert into clients 
    (id, name, lastip, visites) values 
    ('20','John','1.1.1.1','0'), 
    ('21','Kate','1.1.1.2','3'), 
    ('35','Phill','1.1.1.3','90') ; 
    

    既存の行を挿入しようとすると他の列を置き換える)?

  2. insert()をSQLiteDatabaseなどの方法で使用して同じクエリにすべての値を挿入する方法はありますか?クエリ文字列を作成してexecSQL()を使用する必要がありますか?

事前のおかげで

答えて

1

1)は、主キーのクラッシュを回避するための可能性は自動インクリメントフィールドを使用することです。

列は わずかに異なるROWID選択アルゴリズムが使用され、次いで型INTEGER PRIMARY KEY AUTOINCREMENTを持っている場合。新しい行の として選択されたROWIDは、同じテーブルに存在していた を持つ最大のROWIDよりも少なくとも1つ大きいです。

sqliteのマニュアルhereを参照してください。

例では、idが自動増分フィールドである場合は、挿入にそれを指定する必要はありません。

public long insert (String table, String nullColumnHack, ContentValues values) 

値をこのマップは、行の初期列の値が含まれています:あなたが参照するドキュメントが言うように

2)はい、それは()1行のために可能です。 キーはカラム名である必要があり、あなたがプリペアドステートメントを使用する必要がありますしかし、値の列は、(ここで参照:How do I use prepared statements in SQlite in Android?

値あなたが必要とワンショットですべての3行に挿入したい場合は

文字列を作成するか、挿入を3回実行します。

あなたのコメントを編集:

3)これはかなりよく、ここで回答されていますINSERT IF NOT EXISTS ELSE UPDATE?

も参照してくださいここ:UNIQUE制約違反が発生した場合http://sqlite.org/lang_conflict.html

をREPLACE 、REPLACEアルゴリズム は、制約違反の原因となっている既存の行を削除します 現在の行を挿入または更新する前に、コマンド が正常に実行され続けます。NOT NULL制約違反 が発生した場合、REPLACE競合解決によってNULL値が デフォルト値に置き換えられます。または、列にデフォルトの 値がない場合は、ABORTアルゴリズムが使用されます。 CHECK制約 違反が発生した場合、REPLACE競合解消アルゴリズムは常に がABORTのように機能します。

+1

おかげで、私は本当に私が必要なものを、主キーのクラッシュを回避したいいけません既に存在する場合は行を更新しています – Addev

+0

@Adrmedi:質問に追加情報を組み込むために投稿を編集しました – fyr

1

あなたのデータベースにアクセスするためにContentProviderを使用している場合、あなたはapplyBatch()でこれを行うことができます:あなたの答えのための

// List of operations 
ArrayList<ContentProviderOperation) ops 
    = new ArrayList<ContentProviderOperation>(); 

// Create the builder 
ContentProviderOperation.Builder builder 
    = ContentProviderOperation.newInsert(...); 

// Create the first item 
builder.withValue("Name", "John"); 
builder.withValue("IP", '1.1.1.1'); 
ops.add(builder.build()); 

// Create the second item 
builder.withValue("Name", "Kate"); 
builder.withValue("IP", '1.1.1.2'); 
ops.add(builder.build()); 

// Insert the data as one transaction 
getContentProvider().applyBatch("AUTHORITY", ops); 
関連する問題