なお、この質問をすることを意図しているシェアあなたの知識、Q&A形式。
デフォルトではSQLiteは、すなわち隠れ列作成のROWID一意の64ビット符号付き整数値が割り当てられます。
しかし、SQLiteバージョン3.8.2以降、SQLiteはサポートされたROWIDのなしで結果句、行IDが省略されています。
結果は成功した挿入を想定し、何でしょうか?
すなわち長いSQLiteDatabaseから返さINSERTごとに家族(挿入、insertOrThrowとinsertWithOnConflict): -
新たに挿入された行の行ID、または-1エラーが発生した場合
SQLiteバージョン3.8.2以降は、API 21 Lollilopのでのみ利用可能であるとして、次にROWIDなしのみにAPI 21から使用することができます。
- (警告 いくつかのデバイスメーカーがデバイス上のSQLiteの異なるバージョンが含まれています。android.database.sqlite)
そのようなテーブルが存在できないように、結果は不可能であろうように、ROWIDなしコーディングAPI 21の前には、構文エラーをもたらすであろう。
API 21ので、結果は、インサートが他の働いていた場合-1 0が返されていることです。
しかし、単にROWIDテーブル(すなわちないROWIDテーブル)ことなく、単一のテーブルまたは複数の単純なケースを想定しています。
より可能性の高いシナリオであろうミックスにROWIDテーブルを追加し、結果は、データベースが開かれたため(SQLiteのではなく、AndroidのSDKに従って)結果が設定されたことを、前回の通りであるか、または-1。
要するに、値ではない場合は-1、列は、-1、典型的に行が挿入されなかったことを示す(非常に高い)を挿入したことを示しています。
- 警告あなたが行IDを強制する場合があることが-1(供給-1行ID列の直接またはエイリアスを介して)、次いで-1結果を返すことができ、行が挿入されたにもかかわらず。
例
以下は、二つの行が挿入されたROWIDテーブルない単一持つデータベースの作成を示し、その結果はログに出力されます。これはSQLiteのデータベースにアクセスするための、より一般的な手段であることが表示されるSQLiteOpenHelperのサブクラスが使用されています。
DBHelperNoRowid.java(データベースヘルパー)
public class DBHelperNoRowid extends SQLiteOpenHelper {
public final static String DB = "test_norowid";
public static final int VERSION = 1;
public static final String TBL_NOROWID = "norowid";
public static final String COL_ID = BaseColumns._ID;
public static final String COL_MYDATA = "mydata";
SQLiteDatabase mDB;
public DBHelperNoRowid(Context context) {
super(context, DB, null, VERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String crt_norowid_table = "CREATE TABLE IF NOT EXISTS " + TBL_NOROWID + "(" +
COL_ID + " INTEGER PRIMARY KEY, " +
COL_MYDATA + " TEXT" +
") WITHOUT ROWID"; //<<<<<<<<<<
db.execSQL(crt_norowid_table);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long insertUsingConvenienceInsert(long not_an_id, String text) {
ContentValues cv = new ContentValues();
cv.put(COL_ID,not_an_id);
cv.put(COL_MYDATA,text);
return mDB.insert(TBL_NOROWID,null,cv);
}
}
MainActivty.java
public class MainActivity extends AppCompatActivity {
DBHelperNoRowid mDBhlpr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDBhlpr = new DBHelperNoRowid(this);
logInsertResult(2100L,"row 1");
logInsertResult(-898765432,"row 2");
}
private void logInsertResult(long not_an_id, String text) {
Log.d("INSERTRESULT","Insertion of a row returned " + String.valueOf(
mDBhlpr.insertUsingConvenienceInsert(not_an_id,text)
));
}
}
結果
2019-01-23 17:36:04.029 24175-24175/so.uru D/INSERTRESULT: Insertion of a row returned 0 2019-01-23 17:36:04.029 24175-24175/so.uru D/INSERTRESULT: Insertion of a row returned 0
セカンドラン
トラップされるUNIQUE制約の競合、になります上記の実行挿入方法、および-1が返されます例: -
2019-01-23 19:49:51.915 24876-24876/so.uru E/SQLiteDatabase: Error inserting _id=2100 mydata=row 1
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: norowid._id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
at so.uru.DBHelperNoRowid.insertUsingConvenienceInsert(DBHelperNoRowid.java:42)
at so.uru.MainActivity.logInsertResult(MainActivity.java:23)
at so.uru.MainActivity.onCreate(MainActivity.java:16)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-01-23 19:49:51.916 24876-24876/so.uru D/INSERTRESULT: Insertion of a row returned -1
2019-01-23 19:49:51.918 24876-24876/so.uru E/SQLiteDatabase: Error inserting _id=-898765432 mydata=row 2
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: norowid._id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
at so.uru.DBHelperNoRowid.insertUsingConvenienceInsert(DBHelperNoRowid.java:42)
at so.uru.MainActivity.logInsertResult(MainActivity.java:23)
at so.uru.MainActivity.onCreate(MainActivity.java:17)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-01-23 19:49:51.918 24876-24876/so.uru D/INSERTRESULT: Insertion of a row returned -1
コードは、ROWIDのとテーブルのないミックスをテストするために使用しました
- 以下は単にテストのために使用される複数の順列の一つであることに注意してください: -
DBHelperBoRowid.java
public class DBHelperNoRowid extends SQLiteOpenHelper {
public final static String DB = "test_norowid";
public static final int VERSION = 1;
public static final String TBL_NOROWID = "norowid";
public static final String COL_ID = BaseColumns._ID;
public static final String COL_MYDATA = "mydata";
public static final String TBL_WITHROWID = "withrowid";
SQLiteDatabase mDB;
public DBHelperNoRowid(Context context) {
super(context, DB, null, VERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String crt_norowid_table = "CREATE TABLE IF NOT EXISTS " + TBL_NOROWID + "(" +
COL_ID + " INTEGER PRIMARY KEY, " +
COL_MYDATA + " TEXT" +
") WITHOUT ROWID";
db.execSQL(crt_norowid_table);
String crt_withrowid_table = "CREATE TABLE IF NOT EXISTS " + TBL_WITHROWID + "(" +
COL_ID + " INTEGER PRIMARY KEY, " +
COL_MYDATA + " TEXT" +
")";
db.execSQL(crt_withrowid_table);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long insertUsingConvenienceInsert(long not_an_id, String text, boolean without_rowid, boolean generate_rowid) {
ContentValues cv = new ContentValues();
String table = TBL_WITHROWID;
if (without_rowid) {
table = TBL_NOROWID;
cv.put(COL_ID,not_an_id);
} else {
if (generate_rowid) {
cv.put(COL_ID,not_an_id);
}
}
cv.put(COL_MYDATA,text);
return mDB.insert(table,null,cv);
}
public void logLastInsertId() {
Cursor csr = mDB.rawQuery("SELECT last_insert_rowid()",null);
if (csr.moveToFirst()) {
Log.d("LASTINSERTEDROWID","The Last RowID inserted was " + String.valueOf(csr.getLong(0)));
} else {
Log.d("LASTINSERTEDROWID","Ooops there does not appear to have been a row inserted");
}
}
}
(使用された最後の順列ごとなど)MainActivity.java
public class MainActivity extends AppCompatActivity {
DBHelperNoRowid mDBhlpr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDBhlpr = new DBHelperNoRowid(this);
// Insert some rows into the table that is a rowid table
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(-1,"row 1",false,true);
logInsertResult(2100L,"row 1",true,true); //<<<<<<<<<< WITHOUT
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(-898765432,"row 2",true,true); //<<<<<<<<<< WITHOUT
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(1,"row 1",false,false);
logInsertResult(-1L,"3rd row",true,true); //<<<<<<<<<< WITHOUT
}
private void logInsertResult(long no_an_id, String text, boolean without_rowid, boolean generate_rowid) {
if (without_rowid) {
Log.d("INSERTRESULT",">>>>>>>>>> WITHOUT ROWID ATTEMPT");
}
Log.d("INSERTRESULT","Insertion of a row returned " + String.valueOf(
mDBhlpr.insertUsingConvenienceInsert(no_an_id,text,without_rowid,generate_rowid)
));
mDBhlpr.logLastInsertId(); //
}
}