创建数据库后没有调用oncreate!

时间:2011-02-24 04:11:07

标签: android

使用帮助程序创建新数据库,但是根据创建的文档,应该在创建数据库后调用,但不能正确调用。任何PLZ都可以帮我解决这个问题。 Plz见下面的代码。

1)有没有办法创建数据库而不是使用帮助器,如果是这样plz建议我! 2)在数据库创建中以及杀死数据库时将调用哪些回调?

OpenHelper(Context context) 
  {

     super(context, "examplee.db", null, 1 );
     SQLiteDatabase sqlite = null;       
      Log.w(TAG, "Openhelp database, ");
      sqlite =  context.openOrCreateDatabase("examplee.db", Context.MODE_PRIVATE, null );
      Log.e ( TAG,"SQ lite database object "+sqlite );                
  }

 public void onOpen(SQLiteDatabase db)
 {
     Log.e ( TAG,"On open called ");
 }


  @Override
  public void onCreate(SQLiteDatabase db) 
  {
      Log.w(TAG, " On create ");
      //db.execSQL(sql);
     //db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
  {
     Log.w(TAG, "Upgrading database, this will drop tables and recreate.");
     //db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
     //onCreate(db);
  }

}

提前致谢,

4 个答案:

答案 0 :(得分:5)

以下是关于如何从模拟器中删除数据库文件的详细说明(在实际的Android手机上调试非常相似)。

  1. 运行您的模拟器。如果您遇到问题,那么您可以忽略此帮助信息的其余部分!

  2. 根据您的操作系统启动命令行界面。

  3. 执行命令:'adb shell'(当然,省略引号)。这将带你进入Android Debug Bridge;你的提示将改为简单的英镑符号。无论您的原始操作系统如何,您现在都处于简化的unix OS中。

  4. 您现在在模拟器中。键入命令'ls -l'以验证您是否在根目录中(您将看到与unix根目录系统非常相似的内容)。

  5. 将目录更改为存储数据库文件的位置。假设您运行的程序位于软件包com.sillynames.myprogram5中,并且数据库文件名为“myblackbook.db”。您将在目录中找到该文件:

    /data/data/com.sillynames.myprogram5/databases/myblackbook.db

  6. 进入该目录后,只需通过'rm myblackbook.db'删除数据库。

  7. 希望这有帮助! 斯科特

答案 1 :(得分:1)

SQLiteOpenHelper javadoc表示onCreate是“第一次创建数据库时调用。这是表的创建和表的初始填充应该发生的地方。”每次应用程序出现时都不会调用它。在您的情况下,可能已经创建了数据库。

验证db是否存在使用adb登录shell并转到/ data / data /<您的应用程序包名称> / databases并查看employees.db文件是否存在。

在onCreate方法中,您通常会创建表并加载任何初始数据。这是在安装后第一次启动应用程序时执行的。

答案 2 :(得分:0)

  

有没有办法创建数据库而不是使用帮助器,如果是这样,请告诉我!

是的,您可以使用工具SQLite Manager或其他工具在系统上手动创建数据库,并将sqlite db文件捆绑到项目的assets文件夹中。当您的应用程序运行时,您需要将该数据库文件复制到路径/data/data/your_app_package_name/databases/

请参阅:Using your own SQLite database in Android applications

  

在数据库创建中以及杀死数据库时将调用哪些回调?

第一次创建数据库时,调用onCreate()方法。并且无法kill/drop数据库,而是可以删除该db文件。

答案 3 :(得分:0)

确保您等待获取数据库引用。检查您是否有我的问题的数据库参考。已经在类的顶部声明了 Database _db 但在我的函数中它是 null

 final Database db = await initDb();
 print("insert to db $db");

初始化数据库

Future<Database> initDb() async {
print("called db init");
try {
  final dbFolder = await getDatabasesPath();

  if (!await Directory(dbFolder).exists()) {
    print("db path does not exist");
    await Directory(dbFolder).create(recursive: true).then((value) {
      print("db directory $value");
    });
  }

  final dbPath = join(dbFolder, _kBdFileName);
  print("db path $dbPath");

  // open db
  _db = await openDatabase(
    dbPath,
    version: 1,
    onCreate: (db, version) async {
      print("Call on create");
      await _initDBtables(db).then((value) {
        print("on created ");
      });
    },
  );
  print("Db initialized $_db");
  // success init db
  return _db;
} on DatabaseException catch (e) {
  print(e);

  return _db;
}

}