繁体   English   中英

在SQLite数据库中插入错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM