在SQLite数据库中插入时出错

时间:2011-07-23 18:19:32

标签: android database sqlite

我正在尝试创建以下数据库:

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
.
.
. 

所以它抱怨一些约束违规,但我没有看到任何这些。唯一的限制是主键,它们被设置为自动增量,所以我不明白它在抱怨什么。

5 个答案:

答案 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中吗?你之前发生过这件事吗?如果您有一些建议,请分享,因为也许它会在其他日子突然停止工作,谁知道呢?