gpt4 book ai didi

每次启动应用程序时都会重新创建 Android 数据库

转载 作者:IT王子 更新时间:2023-10-29 06:20:10 25 4
gpt4 key购买 nike

为什么每次我的应用程序启动时 SQLiteOpenHelper 都会调用 onCreate()。这是我的 onCreate()

代码
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("onCreate()", "Enter");

//create cards table
db.execSQL(
"create table circles" +
"("+
"id integer primary key,"+
"x integer not null," +
"y integer not null"+
")"
);

Log.i("onCreate()", "Exit");
}

我有一个围绕我的扩展 SQLiteOpenHelper 类的外部类,当我查询时,我这样做:

Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null); 

并因为这个 if 语句而跳过这个 block

if (cursor.moveToFirst()) {...}

这是我的整个数据库包装器类:

package db.main;

import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import testing.main.Circle;

public class DBWrapper {

private static final String DATABASE_NAME = "circles.db";
private static final int DATABASE_VERSION = 1;
private static final String[] TABLES = new String[] { "circles"};

private Context context;
private OpenHelper openHelper;

public DBWrapper(Context context) {
context.deleteDatabase(DATABASE_NAME);
this.context = context;
this.openHelper = new OpenHelper(this.context);
}

public void insertCircle(Circle c) {
String sql = "insert into circles (x, y) values (" + c.getX() + ", " + c.getY() + ")";
Log.i("DBWrapper::insertCircle()", "Executing sql: " + sql);
openHelper.getWritableDatabase().execSQL(sql);
}

public void clearCircles() {
String sql = "delete * from circles";
Log.i("DBWrapper::clearCircles()", "Executing sql: " + sql);
openHelper.getWritableDatabase().execSQL(sql);
}

public ArrayList<Circle> getCircles() {
ArrayList<Circle> circles = new ArrayList<Circle>();
Cursor cursor = openHelper.getWritableDatabase().query(TABLES[0], null, null, null, null, null, null);
//Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null);
Log.i("DBWrapper::getCircles()", "move to first1");
if (cursor.moveToFirst()) {
Log.i("DBWrapper::getCircles()", "move to first");
do {
Log.i("DBWrapper::getCircles()", "Creating circle: " + cursor.getString(1) + ", " + cursor.getString(2));
circles.add(new Circle(Integer.parseInt(cursor.getString(1)),
Integer.parseInt(cursor.getString(2))));
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
return circles;
}

private static class OpenHelper extends SQLiteOpenHelper {

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

@Override
public void onCreate(SQLiteDatabase db) {
Log.i("OpenHelper::onCreate()", "Enter");
//create cards table
db.execSQL(
"create table circles" +
"("+
"id integer primary key,"+
"x integer not null," +
"y integer not null"+
")"
);

Log.i("OpenHelper::onCreate()", "Exit");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("Example", "Upgrading database, this will drop tables and recreate.");
for(String s: TABLES) {
db.execSQL("DROP TABLE IF EXISTS " + s);
}
onCreate(db);
}
}
}

最佳答案

查看您的 DBWrapper 构造函数,

你在打电话

context.deleteDatabase(DATABASE_NAME);

这将在您每次调用时删除数据库文件。强制 SQLHelper 重新创建数据库。

关于每次启动应用程序时都会重新创建 Android 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366802/

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