Я создаю базу данных в Android с помощью SQLite.
Я написал свой код для создания таблицы с именем products
в методе onCreate().
Затем, когда я вызываю метод add() для добавления некоторых значений в таблицу, я получаю сообщение об ошибке, что такой таблицы с именем products
не существует.
Вот мой класс SQLiteHelper:
public class MySQLiteHelper extends SQLiteOpenHelper {
//variable declarations and some code
...
@Override
public void onCreate(SQLiteDatabase db) {
// SQL statement to create a products table
String CREATE_PRODUCTS_TABLE = "CREATE TABLE "+TABLE_NAME+ " ( " +
"id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"url TEXT, " +
"title TEXT, " +
"price INTEGER );";
// create products table
db.execSQL(CREATE_PRODUCTS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
// Create tables again
onCreate(db);
}
void add(String url, String title, String price) {
this.url = url;
this.title = title;
this.price = price;
// 1. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
// 2. create ContentValues to add key "column"/value
ContentValues values = new ContentValues();
values.put(KEY_URL, url);
values.put(KEY_TITLE, title);
values.put(KEY_PRICE, price);
// 3. insert
db.insert(TABLE_NAME, // table
null, //nullColumnHack
values); // key/value -> keys = column names/ values = column values
// 4. close
db.close();
}
Из аналогичного вопроса я прочитал, что onCreate() не является конструктором и вызывается только тогда, когда база данных не существует, но в моем случае база данных тоже не существует, так почему она не вызывается?
Я также узнал, что нам нужно позвонить getWritableDatabase()
или getReadableDatabase()
Но я не уверен, где сделать такой вызов в моем коде.
Я попытался поместить «код создания таблицы», который находится в onCreate()
, в моем методе add()
. При первом запуске я ничего не получил, но в следующий раз я продолжаю получать сообщение об ошибке, что «таблица уже существует».
Теперь, как я могу убедиться, что таблица создана правильно только один раз, прежде чем я вызову свой метод add()
для вставки некоторых значений. Любая помощь, пожалуйста?
ИЗМЕНИТЬ:
Мой Logcat читает:
03-07 00:59:22.684 2107-2147/com.example.nikhil.amazon1 W/EGL_emulation﹕ eglSurfaceAttrib not implemented
03-07 00:59:22.684 2107-2147/com.example.nikhil.amazon1 W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5683060, error=EGL_SUCCESS
03-07 00:59:24.922 2107-2120/com.example.nikhil.amazon1 I/art﹕ Background sticky concurrent mark sweep GC freed 1464(89KB) AllocSpace objects, 7(2MB) LOS objects, 7% free, 9MB/9MB, paused 75.596ms total 203.616ms
03-07 00:59:25.338 2107-2413/com.example.nikhil.amazon1 E/SQLiteLog﹕ (1) no such table: products
03-07 00:59:25.339 2107-2413/com.example.nikhil.amazon1 E/SQLiteDatabase﹕ Error inserting price= 24,599.00 title=Google Nexus 5 D821 (16GB, Black) url=http://www.amazon.in/Google-Nexus-D821-16GB-Black/dp/B00GC1J55C/ref=sr_1_1?s=electronics&ie=UTF8&qid=1421161258&sr=1-1&keywords=Google
android.database.sqlite.SQLiteException: no such table: products (code 1): , while compiling: INSERT INTO products(price,title,url) VALUES (?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
at com.example.nikhil.amazon1.MySQLiteHelper.add(MySQLiteHelper.java:86)
at com.example.nikhil.amazon1.FirstParsing$1.run(FirstParsing.java:71)
at java.lang.Thread.run(Thread.java:818)
Моя проблема точно такая же, как: 1) Android SQLiteOpenHelper: метод onCreate() не называется. Почему?
2) SQLiteOpenHelper не может вызвать onCreate?
3) SQLiteOpenHelper onCreate не вызывается? (БД не существует)
Но мне трудно понять это и применить к моему коду.
"CREATE TABLE TABLE_NAME ( "
. Разве не должно быть написано"CREATE TABLE "+TABLE_NAME+" ( "
? - person antonio   schedule 06.03.2015"CREATE TABLE TABLE_NAME ( "
создает таблицу с именем TABLE_NAME. Ваш код должен быть"CREATE TABLE "+TABLE_NAME+" ( "
для использования вашегоprivate static final String TABLE_NAME = "products";
- person antonio   schedule 06.03.20151
, а это означает, что ваш методonUpgrade
никогда не будет вызван, поскольку база данных уже является последней версией. Удалить файл базы данных. Вы можете сделать это, удалив приложение на своем устройстве или очистив хранилище вашего приложения. Вы также можете увеличить код версии БД. Однако ваш обновленный код создания таблицы теперь имеет синтаксическую ошибку. В конец строки"CREATE TABLE"
нужно добавить пробел, иначе результирующий код SQL будет иметь вид:CREATE TABLEproducts...
. - person tiguchi   schedule 06.03.2015