[英]Error inserting in SQLite database
我正在尝试创建以下数据库:
public static final String KEY_NAME = "nombre";
public static final String KEY_ROWID = "_id";
public static final String KEY_ID = "id";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_CREATE =
"create table capas (_id integer primary key autoincrement, "
+ "id text not null, "
+ "nombre text not null);"
+ "create table poi (_id integer primary key autoincrement, "
+ "id text not null, "
+ "nombre text not null, "
+ "lon real not null, "
+ "lat real not null, "
+ "info text, "
+ "email text, "
+ "telefono text, "
+ "web text, "
+ "usuario text, "
+ "capas_id text not null);"
+ "create table mensajes (_id integer primary key autoincrement, "
+ "id text not null, "
+ "mensaje text not null, "
+ "fecha text not null, "
+ "poi_id text not null, "
+ "usuario text not null);";
private static final String DATABASE_NAME = "upv_db";
private static final String DATABASE_TABLE_CAPAS = "capas";
private static final String DATABASE_TABLE_POIS = "poi";
private static final String DATABASE_TABLE_MENSAJES = "mensajes";
private static final int DATABASE_VERSION = 2;
里面有三张桌子。 这些是从第一个表初始化,创建和检索行的方法(我尚未为其他两个表编写方法):
public long createCapa(String id, String nombre) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ID, id);
initialValues.put(KEY_NAME, nombre);
return mDb.insert(DATABASE_TABLE_CAPAS, null, initialValues);
}
/**
* Return a Cursor over the list of all notes in the database
*
* @return Cursor over all notes
*/
public Cursor leerCapas() {
return mDb.query(DATABASE_TABLE_CAPAS, new String[] {KEY_ROWID, KEY_ID, KEY_NAME}, null, null, null, null, null);
}
//Inicializa la tabla de capas por defecto
public void inicializaCapas(){
createCapa("cap001", "Escuelas");
createCapa("cap002", "Departamentos");
createCapa("cap003", "Edificios");
}
该应用程序无法正常工作,因为在插入数据库时出现错误。 这是日志中的错误:
07-23 20:39:14.354: ERROR/Database(743): Error inserting nombre=Escuelas id=cap001
07-23 20:39:14.354: ERROR/Database(743): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
07-23 20:39:14.354: ERROR/Database(743): at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
07-23 20:39:14.354: ERROR/Database(743): at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55)
07-23 20:39:14.354: ERROR/Database(743): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549)
07-23 20:39:14.354: ERROR/Database(743): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
07-23 20:39:14.354: ERROR/Database(743): at com.android.upvar.DatosDB.createCapa(DatosDB.java:131)
07-23 20:39:14.354: ERROR/Database(743): at com.android.upvar.DatosDB.inicializaCapas(DatosDB.java:180)
07-23 20:39:14.354: ERROR/Database(743): at com.android.upvar.menu.listaCapas(menu.java:52)
07-23 20:39:14.354: ERROR/Database(743): at com.android.upvar.menu.onCreate(menu.java:46)
07-23 20:39:14.354: ERROR/Database(743): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-23 20:39:14.354: ERROR/Database(743): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-23 20:39:14.354: ERROR/Database(743): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-23 20:39:14.354: ERROR/Database(743): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-23 20:39:14.354: ERROR/Database(743): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-23 20:39:14.354: ERROR/Database(743): at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 20:39:14.354: ERROR/Database(743): at android.os.Looper.loop(Looper.java:123)
07-23 20:39:14.354: ERROR/Database(743): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-23 20:39:14.354: ERROR/Database(743): at java.lang.reflect.Method.invokeNative(Native Method)
07-23 20:39:14.354: ERROR/Database(743): at java.lang.reflect.Method.invoke(Method.java:521)
07-23 20:39:14.354: ERROR/Database(743): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-23 20:39:14.354: ERROR/Database(743): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-23 20:39:14.354: ERROR/Database(743): at dalvik.system.NativeStart.main(Native Method)
07-23 20:39:14.394: ERROR/Database(743): Error inserting nombre=Departamentos id=cap002
.
.
.
因此它抱怨某些约束违反,但我没有看到任何约束。 唯一的约束是主键,它们被设置为自动增量,因此我不明白它在抱怨什么。
我想到的“约束失败”的第一件事是正在插入NULL或缺少列。 在该示例中,没有任何内容作为NULL插入,唯一缺少的列是自动增量主键。
但是,除非您以某种方式指出,否则不会在每个测试中重新创建数据库和表。 您能否在其中具有这些表的较旧版本的设备上进行测试,而该设备的“ _id”列不是自动递增的? 如果是这样,则期望ContentValues也包含该列的值。
嗯...尝试这个想法:
在编写之前,您是否尝试过允许写入数据库? SQLiteDatabase.OPEN_READWRITE
?
喜欢
mDb=SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READWRITE);
?
我尚未使用Android,因此可能会关闭,但似乎您正在将ID和插入内容发送到CAPAS表中,但这不是必需的,因为您已将其定义为AUTOINCREMENT。
你有:
public long createCapa(String id, String nombre) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_ID, id);
initialValues.put(KEY_NAME, nombre);
return mDb.insert(DATABASE_TABLE_CAPAS, null, initialValues);
}
如果执行此操作会怎样?
public long createCapa( String nombre) {
ContentValues initialValues = new ContentValues();
//initialValues.put(KEY_ID, id);
initialValues.put(KEY_NAME, nombre);
return mDb.insert(DATABASE_TABLE_CAPAS, null, initialValues);
}
和这个:
createCapa("Escuelas");
在Android中同时定义_id和id是否真的很普遍? 当您在SQLite中将pk定义为整数主键时,它将自动成为rowid的别名。 这是我通常会做的事情:
create table capas (id integer primary key autoincrement, nombre text not null);
当我无缘无故地遇到相同的错误时,您可以尝试它为我工作
return mDb.insertWithOnConflict(DATABASE_TABLE_CAPAS, null,
initialValues,SQLiteDatabase.CONFLICT_REPLACE);
在这两天中,我尝试了您的所有建议,并表示感谢。 但是你知道吗? 今天当我启动Eclipse时,我运行了该应用程序,然后我就开始工作了。 我不知道该怎么做,因为昨天我完成尝试后不起作用。 但是令人惊讶的是它是固定的。
我对此感到很高兴,但同时也很担心,因为这让我感到该应用程序不可靠。 这些事情通常发生在Android或SQLite中吗? 以前有没有发生过 如果您有任何建议,请分享,因为它可能会在某天突然停止工作,谁知道呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.