每次启动应用程序时,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

每次我进入主屏幕时,Android都会杀死我的应用程序

每次我打开应用程序时,Phonegap 应用程序都会重新启动。有啥建议可以返回同一页面吗?

Android 位置管理器每次返回相同的 GPS 坐标