gpt4 book ai didi

java - Android - WITHOUT ROWID 表的插入便捷方法返回什么值?

转载 作者:搜寻专家 更新时间:2023-11-01 09:21:58 24 4
gpt4 key购买 nike

Note This Question is intended to be a share your knowledge, Q&A-style.

SQLite 默认创建一个隐藏列,即 rowid,它将被分配一个唯一的 64 位有符号整数值。

但是,从 SQLite 3.8.2 版本开始,SQLite 支持了 WITHOUT ROWID 子句,这导致 rowid 被省略。

假设插入成功,结果会是什么?

即根据 :-

从 SQLiteDatabase insert 系列(insert、insertOrThrow 和 insertWithOnConflict)返回的 long

the row ID of the newly inserted row, or -1 if an error occurred

SQLiteDatabase - insert

最佳答案

由于 SQLite 版本 3.8.2 或更高版本仅在 API 21 Lollilop 之后可用,因此 WITHOUT ROWID 只能从 API 21 开始使用。

在没有 ROWID 的 API 21 编码之前会导致语法错误,因此不可能有结果,因为这样的表不存在。

从 API 21 开始,结果是返回 0,如果插入有效,否则返回 -1。

但是,这只是假设单个表或多个 WITHOUT ROWID 表(即没有 ROWID 表)的简单情况。

将 ROWID 表添加到组合中,这将是更可能的情况,那么结果与之前的时间相同,因为数据库已打开,结果已设置(根据 SQLite 而不是 Android SDK)或-1.

简而言之,如果该值不是 -1,则表示插入了一行(很有可能),-1 通常表示未插入该行。

  • 警告 如果您将 rowid 强制设置为 -1(直接或通过别名为 rowid 列提供 -1),则可能会返回 -1 的结果,即使该行已插入.

例子

下面演示创建一个数据库,单表WITHOUT ROWID,插入两行,结果输出到日志。使用了 SQLiteOpenHelper 的子类,因为这似乎是访问 SQLite 数据库的更常用方法。

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);
}
}

主 Activity .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约束冲突,会被insert方法捕获,然后返回-1 e.g. :-

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(); //
}
}

关于java - Android - WITHOUT ROWID 表的插入便捷方法返回什么值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com