Android SQLiteDatabase表不存在

时间:2014-01-08 16:41:48

标签: android database sqlite

我有一个名为GameDb的类,它正在扩展SQLiteOpenHelper。我不知道为什么,但是创建它没有被调用,表格没有被创建!

对我的所有活动和片段都有一个singelton:

public MyApp extends Application
{
   // .... Code

   private GameDb gameDb;

   public GameDb getGameDb()
   {
      if (gameDb == null)
         gameDb = new GameDb(this);

      return this.gameDb;
   }
}

从数据库获取所有游戏,从活动中调用

public class MyActivity extends FragmentActivity
{
   @Override
   protected void onCreate(Bundle bundle)
   {
      // Code....

      // Get all games
      ArrayList<Game> allGames = getMyApp().getGameDb().getAllGames();
   }
}

包含查询数据库(写入和读取)的所有必要方法的类。这些方法不在下面写,因为没有必要。

public class GameDb
{
   private SQLiteDatabase db;
   private GameDbHelper dbHelper;

   public GameDb(Context context)
   {
      this.dbHelper = new GameDbHelper(context);
      this.db = dbHelper.getWritableDatabase();
   }

   public ArrayList<Games> getAllGames()
   {
       // return db.query(....);
   }

   public void insertNewGame(int id, String name)
   {
      // db.query(....);
   }

   // Static inner class which extends SQLiteOpenHelper
   private static class GameDbHelper extends SQLiteOpenHelper
   {
      public GameDbHelper(Context context)
      {
         super(context, "DB_NAME", null, 1);
      }

      // On create not called !
      @Override
      public void onCreate(SQLiteDatabase db)
      {
         db.execSQL("CREATE TABLE my_table(_id INTEGER AUTOINCREMENT, date TEXT);");
      }

      @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
      {
         dropTable(db);
         onCreate(db);
      }

      public void dropTable(SQLiteDatabase db)
      {
         db.execSQL("DROP TABLE IF EXISTS my_table");
      }
   }     
}

当我想要获得所有游戏或添加新游戏时,我会得到致命的异常,(1)没有这样的表:my_table

2 个答案:

答案 0 :(得分:1)

您的设备上可能存在旧数据库,并且在使用IDE重新安装应用程序时,数据库并不总是被删除。因此,您必须手动卸载应用程序并使用IDE重新安装应用程序。

答案 1 :(得分:0)

我不相信在实例化数据库对象时会隐式调用onCreate()。您需要显式调用Activity的openOrCreateDatabase()方法。