Ошибка вставки в базу данных SQLite - PullRequest
0 голосов
/ 23 июля 2011

Я пытаюсь создать следующую базу данных:

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

Так что он жалуется на какое-то нарушение ограничений, но я не вижу ни одного из них.Единственными ограничениями являются первичные ключи, и они настроены на автоинкремент, поэтому я не понимаю, на что они жалуются.

Ответы [ 5 ]

1 голос
/ 24 июля 2011

Первое, что я думаю о «сбое ограничения», это то, что что-то либо вставляется в NULL, либо вы пропускаете столбец. В этом примере ничего не вставляется как NULL, и единственный отсутствующий столбец - это первичный ключ автоинкремента.

Однако, если вы не укажете это каким-либо образом, база данных и таблицы не воссоздаются при каждом тесте. Не могли бы вы провести тестирование на устройстве с более старой версией этих таблиц, в которой столбец "_id" не был автоинкрементным? Если это так, он ожидает, что ContentValues ​​также будет содержать значение для этого столбца.

0 голосов
/ 11 февраля 2012

ВЫ можете попробовать это, это работало на меня, когда я получал ту же ошибку без причины

return mDb.insertWithOnConflict(DATABASE_TABLE_CAPAS, null,
  initialValues,SQLiteDatabase.CONFLICT_REPLACE);
0 голосов
/ 26 июля 2011

Я испробовал все ваши предложения в течение этих 2 дней, и я ценю их. Но вы знаете, что? Когда я запустил Eclipse сегодня, я запустил приложение, и я только что работал. Я понятия не имею, как, потому что вчера, когда я закончил пробовать, это не сработало. Но на удивление это исправлено.

Я очень рад этому, но также обеспокоен, потому что это заставляет меня чувствовать, что приложение ненадежно. Обычно это происходит в Android или в SQLite? Это случилось с тобой раньше? Если у вас есть какой-нибудь совет, пожалуйста, поделитесь им, потому что, может быть, он вдруг перестанет работать в другой день, кто знает?

0 голосов
/ 24 июля 2011

Я не работал с Android, поэтому это может быть отключено, но, похоже, вы отправляете идентификатор с вставкой в ​​таблицу 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");

Действительно ли обычная практика - определять _id и id в Android? Когда вы определяете pk как целочисленный первичный ключ в SQLite, он автоматически становится псевдонимом для rowid. Вот как я бы сделал это нормально:

       create table capas (id integer primary key autoincrement, nombre text not null);
0 голосов
/ 23 июля 2011

Хм ... попробуйте эту идею:

Вы пытались разрешить запись в базу данных, прежде чем писать?SQLiteDatabase.OPEN_READWRITE?

Как

mDb=SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READWRITE);?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...