我正在尝试创建以下数据库:
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;
里面有三张桌子。这些是从第一个表初始化,创建和检索行的方法(我还没有为其他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
.
.
.
所以它抱怨一些约束违规,但我没有看到任何这些。唯一的限制是主键,它们被设置为自动增量,所以我不明白它在抱怨什么。
答案 0 :(得分:1)
我认为“约束失败”的第一件事是,某些东西要么被插入NULL,要么你错过了一个列。在该示例中没有任何内容作为NULL插入,唯一缺少的列是自动增量主键。
但是,除非您以某种方式指明它,否则不会在每次测试中重新创建数据库和表。您是否可以在其中包含旧版本表格的设备上进行测试,其中“_id”列不是自动增量?如果是这样,它期望ContentValues也包含该列的值。
答案 1 :(得分:0)
您是否尝试过在写作之前写入数据库? SQLiteDatabase.OPEN_READWRITE
?
喜欢
mDb=SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READWRITE);
?
答案 2 :(得分:0)
我没有使用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);
答案 3 :(得分:0)
当我无缘无故地得到同样的错误时,你可以试试这个对我有用
return mDb.insertWithOnConflict(DATABASE_TABLE_CAPAS, null,
initialValues,SQLiteDatabase.CONFLICT_REPLACE);
答案 4 :(得分:-1)
我在这两天内尝试了你的所有建议,我很感激他们。但你知道吗?当我今天启动Eclipse时,我运行应用程序,我刚刚开始工作。我不知道怎么样,因为昨天我完成尝试后就没用了。但令人惊讶的是,它是固定的。
我很高兴,但也很关心,因为这让我觉得应用程序不可靠。这些事情通常发生在Android或SQLite中吗?你之前发生过这件事吗?如果您有一些建议,请分享,因为也许它会在其他日子突然停止工作,谁知道呢?