sqlite в андроиде не распознает новую колонку я добавил - PullRequest
0 голосов
/ 28 марта 2012

Моя база данных в моем приложении работала нормально, затем я добавил одометр в базу данных. Теперь я получаю таблицу инспекций, в которой нет столбца с именем odometer:, при компиляции: INSERT INTO инспекции (codriver, одометр, водитель, datetime, vehicle_id, status, vehicle_type) VALUES (?,?,?,?,?,?,? ); ошибка в logcat. Я проверил мой адаптер БД, и код работает правильно, но по какой-то причине он не распознает добавленный новый столбец. Вот код из БД

@Override
public void onCreate(SQLiteDatabase db)
{
    String DATABASE_CREATE = "create table inspections ("
            + "_id integer  primary key autoincrement, "
            + "vehicle_id   string  not null, "
            + "vehicle_type string  not null, "
            + "datetime     integer not null, "
            + "driver       string  not null, "
            + "codriver     string  , "
            + "status       integer not null, "
            + "odometer     string  not null "
            + ");";
    db.execSQL(DATABASE_CREATE);

}

вот код для основной базы данных

public class SignalSetDBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "db";
private static final int DATABASE_VERSION = 1;

public SignalSetDBHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Method is called during creation of the database
@Override
public void onCreate(SQLiteDatabase db) {
    CurrentStateTable.onCreate(db);
    HoursOfServiceTable.onCreate(db);
    InspectionsTable.onCreate(db);
    }

// Method is called during an upgrade of the database,
// e.g. if you increase the database version
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
    CurrentStateTable.onUpgrade(database, oldVersion, newVersion);
    HoursOfServiceTable.onUpgrade(database, oldVersion, newVersion);
    InspectionsTable.onUpgrade(database, oldVersion, newVersion);
}
}

Я могу включить больше кода, но уверен, что ошибка в коде выше

обновление: удалил приложение на эмуляторе, по-прежнему получая ту же ошибку. Вот логкат 03-28 12: 52: 59.135: D / dalvikvm (331): GC_EXTERNAL_ALLOC освободил 885 объектов / 63248 байт за 78 мс 03-28 12: 53: 05.695: D / dalvikvm (331): GC_FOR_MALLOC освободил 4480 объектов / 261760 байт за 73 мс 03-28 12: 53: 17.065: W / KeyCharacterMap (331): нет клавиатуры для идентификатора 0 03-28 12: 53: 17.065: W / KeyCharacterMap (331): использование таблицы ключей по умолчанию: /system/usr/keychars/qwerty.kcm.bin 03-28 12: 53: 28.615: I / база данных (331): sqlite вернул: код ошибки = 1, msg = в таблице проверок нет столбца с именем одометр 03-28 12: 53: 28.715: D / dalvikvm (331): GC_FOR_MALLOC освободил 8584 объекта / 420616 байт за 84 мс 03-28 12: 53: 28.715: E / База данных (331): Ошибка при вставке codriver = одометр = 4321 водитель = jim datetime = 1332964380 vehicle_id = ET 432 статус = 1 тип_транспорта = грузовик 03-28 12: 53: 28.715: E / Database (331): android.database.sqlite.SQLiteException: в таблице проверок нет столбца с именем одометр: при компиляции: INSERT INTO проверки (кодривер, одометр, водитель, дата-время, vehicle_id, status, vehicle_type) VALUES (?,?,?,?,?,?,?); 03-28 12: 53: 28.715: E / Database (331): в android.database.sqlite.SQLiteCompiledSql.native_compile (собственный метод) 03-28 12: 53: 28.715: E / Database (331): в android.database.sqlite.SQLiteCompiledSql.compile (SQLiteCompiledSql.java:91) 03-28 12: 53: 28.715: E / Database (331): в android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:64) 03-28 12: 53: 28.715: E / Database (331): на android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:80) 03-28 12: 53: 28.715: E / Database (331): в android.database.sqlite.SQLiteStatement. (SQLiteStatement.java:36) 03-28 12: 53: 28.715: E / Database (331): в android.database.sqlite.SQLiteDatabase.compileStatement (SQLiteDatabase.java:1145) 03-28 12: 53: 28.715: E / Database (331): в android.database.sqlite.SQLiteDatabase.insertWithOnConflict (SQLiteDatabase.java:1536) 03-28 12: 53: 28.715: E / Database (331): в android.database.sqlite.SQLiteDatabase.insert (SQLiteDatabase.java:1410) 03-28 12: 53: 28.715: E / База данных (331): в com.signalsetapp.database.InspectionDBAdapter.insertInspection (InspectionDBAdapter.java:54) 03-28 12: 53: 28.715: E / База данных (331): на com.signalsetapp.report.save (report.java:120) 03-28 12: 53: 28.715: E / База данных (331): на java.lang.reflect.Method.invokeNative (собственный метод) 03-28 12: 53: 28.715: E / База данных (331): на java.lang.reflect.Method.invoke (Method.java:521) 03-28 12: 53: 28.715: E / База данных (331): на android.view.View $ 1.onClick (View.java:2067) 03-28 12: 53: 28.715: E / База данных (331): на android.view.View.performClick (View.java:2408) 03-28 12: 53: 28.715: E / База данных (331): на android.view.View $ PerformClick.run (View.java:8816) 03-28 12: 53: 28.715: E / База данных (331): на android.os.Handler.handleCallback (Handler.java:587) 03-28 12: 53: 28.715: E / База данных (331): на android.os.Handler.dispatchMessage (Handler.java:92) 03-28 12: 53: 28.715: E / База данных (331): на android.os.Looper.loop (Looper.java:123) 03-28 12: 53: 28.715: E / база данных (331): на android.app.ActivityThread.main (ActivityThread.java:4627) 03-28 12: 53: 28.715: E / База данных (331): на java.lang.reflect.Method.invokeNative (собственный метод) 03-28 12: 53: 28.715: E / База данных (331): на java.lang.reflect.Method.invoke (Method.java:521)03-28 12: 53: 28.715: E / База данных (331): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:868) 03-28 12: 53: 28.715: E / База данных (331): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626) 03-28 12: 53: 28.715: E / База данных (331): at dalvik.system.NativeStart.main (собственный метод)

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

SQLiteOpenHelper видит вашу существующую базу данных и поэтому не вызывает onCreate.

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

Если вы находитесь в режиме разработки, вы можете просто сменить DATABASE_NAME на db2, чтобы быстро приступить к работе, но не забудьте поменять его позже, когда ваша база данных станет стабильной.сделать это наиболее подходящим образом, вы можете увеличить DATABASE_VERSION, а затем реализовать некоторые ALTER TABLE операторы в onUpgrade.

0 голосов
/ 06 июля 2014

Я думаю, что самый простой способ справиться с этим заключается в следующем:

  1. Внесите любые необходимые изменения в свои таблицы

  2. Увеличение версии вашей базы данных на 1

  3. Бросьте таблицы полностью в onUpgrade()

  4. Создайте таблицу (таблицы) / всю базу данных в onUpgrade(), вызвав метод onCreate().

  5. Запустите ваше приложение, и изменения в базе данных или таблицах должны быть успешно отражены.

Вот пример кода:

@Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CurrentStateTable_TABLE_CREATE);
            Log.i(LOGTAG, "CurrentStateTable Table created");

            db.execSQL(HoursOfServiceTable_TABLE_CREATE);
            Log.i(LOGTAG, "HoursOfServiceTable Table created");

            db.execSQL(InspectionsTable_TABLE_CREATE);
            Log.i(LOGTAG, "InspectionsTable Table created");

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + CurrentStateTable);
            db.execSQL("DROP TABLE IF EXISTS " + HoursOfServiceTable);
            db.execSQL("DROP TABLE IF EXISTS " + InspectionsTable);
            onCreate(db);

            Log.i(LOGTAG, "Database successfully upgraded " + "from " + oldVersion + " to " + newVersion);
        }
0 голосов
/ 28 марта 2012

При первом открытии базы данных будет вызываться метод onCreate SQLiteOpenHelper, а затем после него не будет вызываться.

И метод onUpgrade будет вызываться при обновлении базы данныхверсия.Итак, предположим, что вы создаете свою базу данных с использованием Sqlite версии 1.0, а затем для обновления базы данных вам придется изменить версию базы данных больше текущей версии базы данных. В вашем случае вам придется изменить значение переменной DATABASE_VERSION2. 2. 1008 *

Примечание: - Если вы измените версию базы данных, она вызовет метод onUpgrade, чтобы выполнить весь код в этом методе, так что вы получитепомещать только те запросы для таблиц, которые вы хотите обновить, в противном случае, если вы поставите все запросы на обновление таблиц, тогда будут обновлены все таблицы вашей базы данных, так что, возможно, вы потеряли все свои предыдущие данные из старой базы данных.

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