gpt4 book ai didi

java - SQLiteHelper 的 onCreate() 方法永远不会被调用

转载 作者:行者123 更新时间:2023-11-30 02:18:36 26 4
gpt4 key购买 nike

我正在使用 SQLite 在 android 中创建一个数据库。

我编写代码在 onCreate() 方法中创建一个名为 products 的表。

然后,当我调用 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() method is not called. Why?

2) SQLiteOpenHelper failing to call onCreate?

3) SQLiteOpenHelper "onCreate" is not called? (the DB does not exist)

但我发现很难理解它并将其应用到我的代码中。

最佳答案

这可能有助于 future 的发展

MySQLiteHelper - 定义数据库、表格等

public class MySQLiteHelper extends SQLiteOpenHelper {

private static final String FILE_NAME = "application.db";
private static final int DB_VERSION = 1;
private final String TAG = MySQLiteHelper.class.getCanonicalName();
private static SQLiteDatabase database = null;

public MySQLiteHelper(Context context) {
super(context, FILE_NAME, null, DB_VERSION);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//version 1
database.execSQL(ProductsTbl.CREATE_SQL);
//can create new tables if necessary, make sure to increase database version

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.i(TAG, "Upgrading from version " + oldVersion + " to version "
+ newVersion);
for (int i = oldVersion + 1; i <= newVersion; i++) {
Log.i(TAG, "version is becoming current " + i);
switch (i) {
case 2:
db.execSQL(ProductsTbl.CREATE_SQL);
break;
//add more cases for each additional table added

}
}
}

public static class ProductsTbl {
public static final String TABLE_NAME = "products";
public static final String ID = "_id";
public static final String URL = "url";
public static final String TITLE = "title";
public static final String PRICE = "price";
public static final String[] TABLE_COLUMNS = { ID, URL, TITLE, PRICE };
public static final String CREATE_SQL = "create table " + TABLE_NAME
+ "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ URL + " TEXT,"
+ TITLE + " TEXT,"
+ PRICE + " INTEGER);";
}

}

MySQLiteDatasource - 定义访问方法,插入、删除等。

public class MySQLiteDatasource {

//Database fields
private SQLiteDatabase database;
private MySQLiteHelper dbHelper;

public MySQLiteDatasource(Context context) {
dbHelper = new MySQLiteHelper(context);
}

public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}

public void close() {
dbHelper.close();
}

public void insertProduct(String url, String title, String price) {
ContentValues values = new ContentValues();
values.put(MySQLiteHelper.ProductsTbl.URL, url);
values.put(MySQLiteHelper.ProductsTbl.TITLE, title);
values.put(MySQLiteHelper.ProductsTbl.PRICE, price);

try {
database.insertOrThrow(MySQLiteHelper.ProductsTbl.TABLE_NAME, null, values);
} catch (SQLiteConstraintException e) {
//System.out.println(e);
Log.e("SQLite Database", "Unable to INSERT into Database, possible duplicate topic already exists.");
}
}

}

以下是如何在 Activity 或类似 Activity 中使用这两个类。

  public static void addProductToDB(String url, String title, String price) {
MySQLiteDatasource datasource = new MySQLiteDatasource(this);
datasource.open();
datasource.insertProduct(url, title, price);
datasource.close();
}

您可能还想定义一个 Product 对象来保存稍后从数据库中获取的数据。

关于java - SQLiteHelper 的 onCreate() 方法永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28905679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com