每次启动应用程序时,Android 数据库都会重新创建
Posted
技术标签:
【中文标题】每次启动应用程序时,Android 数据库都会重新创建【英文标题】:Android database recreates every time application is launched 【发布时间】:2011-03-22 23:04:58 【问题描述】:为什么每次我的应用程序启动时,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 语句而跳过这个块
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);
【问题讨论】:
嗯。你是在模拟器上测试吗?如果是这样,也许您应该在启动之前检查以确保您没有从模拟器中擦除用户数据。 也许您可以发布您的整个数据库代码?我没有看到你在这里遇到的问题:/ PS - 在您的创建 SQL 中添加“IF NOT EXISTS”可能会很好。这将防止错误或覆盖旧数据库 【参考方案1】:看看你的 DBWrapper 构造函数,
你在打电话
context.deleteDatabase(DATABASE_NAME);
这将在您每次调用时删除数据库文件。强制 SQLHelper 重新创建数据库。
【讨论】:
@LizB 请帮我link解决我的问题【参考方案2】:希望下面的链接有所帮助。
***.com -> Query if Adroid DB exists!
希望有帮助
上面的海报也提到你正在删除数据库
content.deleteDabase(DATABASE_NAME)
在你的 DBWrapper() 构造函数中
【讨论】:
【参考方案3】:试试这个:
public class DataBaseHelper extends SQLiteOpenHelper
private static final String DATENBANK_NAME = "yourdatabase.db";
private static final int DATENBANK_VERSION = 1;
public DataBaseHelper(Context context)
super(context, DATENBANK_NAME, null, DATENBANK_VERSION);
public void onCreate(SQLiteDatabase db)
db.execSQL(PartialTripTbl.SQL_CREATE);
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
db.execSQL("DROP TABLE IF EXISTS " + PartialTripTbl.TABLE_NAME);
onCreate(db);
【讨论】:
【参考方案4】:如果您想在应用第一次启动时创建一次数据库,那么您需要修改该查询。
您需要检查数据库是否已经存在,如果不存在则创建数据库,否则不创建数据库。
如果不存在则创建 TABLE TABLE_NAME (key data_type);
在 onCreate 方法中调用这个查询。
【讨论】:
以上是关于每次启动应用程序时,Android 数据库都会重新创建的主要内容,如果未能解决你的问题,请参考以下文章
每次有提交到 json 服务器时,Angular 应用程序都会重新启动
Heroku:每次测功机重新启动时都会丢失 Django 数据库文件
每次页面重新启动时,Firebase.auth().currentUser 都会变为 null