B. *_*non 4 android sqliteopenhelper android-sqlite
我在多个SQLite教程中注意到,在onCreate()扩展的类的情况下重新创建表SQLiteOpenHelper.我已经在Firefox加载项的帮助下在Android环境(Eclipse IDE)之外创建了我的SQLite数据库和表.数据库表位于预期的位置:
C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets
我不得不每次都以编程方式重新创建它们(显然,它们会继续存在并保留数据,或者重点是什么)似乎很奇怪?但是,我现在对此应用程序存在严重问题,这引出了我的问题:
令我懊恼的是,我刚刚意识到我没有创建我的数据库表C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets,而是将它们放入C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic\assets,这是应用程序的早期版本,但将SQLite文件复制到正确的位置并没有改变一点.如果这是导致问题的原因,那就是我的应用程序正在寻找AWOL数据库,仅仅复制并粘贴文件是不够的?我必须做些什么来正式
将数据库引入system/Android/Eclipse目录吗?有什么建议?
我觉得你在这里误会了.构造SQLiteOpenHelper对象时,它将检查SQLite数据库是否存在,如果不存在,它将调用其onCreate()方法(通常开发人员实现create database SQL)
更新:
@Clay Shannon:我将解释Eclipse和Android项目工作的机制.假设您使用Eclipse编写Android项目.新项目将在工作区中创建一个项目文件夹(在您的情况下,它是C:\ aXX3和Space\Android\workspace,项目文件夹是OnDemandAndAutomatic_Project).这个文件夹将包含几个子文件夹,例如:src,bin,assets,res,...每个文件夹都有自己的角色,你对assets文件夹感兴趣,对吧?Assets文件夹用于包含引用文件(不能或不想放入res文件夹),例如:html文件,声音文件,图像文件,文本文件......当Eclipse从项目构建apk时,这些文件也包含在apk中.当您在Android设备上安装apk时,apk会被复制到Android系统文件夹中,并且还会创建一个包含应用数据的文件夹,如Dharmendra所述:/ data/data/{packagename} /(包名称,如com.google.应用程序等,此路径适用于您设备的Android操作系统,而不适用于Windows).
希望你现在可以解决你的问题.注意:您已存在的数据库必须是SQLite数据库,或者即使您复制到正确的路径,应用程序也无法识别它.
实际上SQLiteOpenHelper负责您的数据库创建、升级等等。如果您想以编程方式创建表,那么您必须在该类的 onCreate 方法中编写创建表查询。如果SQLiteOpenHelper您想在先前创建数据库后更新数据库,您可以在 onUpgrade 方法中编写修改后的表查询更改数据库版本。
如果您已经在外部创建了一个数据库并且想要使用该数据库,则必须将该数据库放入资产文件夹中,并将该文件复制到该文件夹中的数据库文件夹中/data/data/packagename/databases。
这是将数据库从资产复制到数据库文件夹的示例
private static boolean copyDataBase(Context c) throws IOException {
String DB_PATH = "/data/data/" + c.getPackageName() + "/databases/";
AssetManager mg = c.getResources().getAssets();
InputStream myInput = null;
try {
myInput = mg.open(DATABASE_NAME);
} catch (IOException ex) {
return false;
}
if (myInput != null) {
String outFileName = DB_PATH + DATABASE_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[8000];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
Log.d(TAG, "Database is copied");
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这是检查数据库及其版本以进行复制的方法
public void copyDatabase() {
try {
SharedPreferences preferences = c.getSharedPreferences(c.getPackageName(), Context.MODE_PRIVATE);
if (checkDataBase(c)) {
if (preferences.getInt("dbversion", 0) != 0) {
c.deleteDatabase(DatabaseHelper.DATABASE_NAME);
}
}
getReadableDatabase();
close();
if (copyDataBase(c)) {
Editor editor = preferences.edit();
editor.putInt("dbversion", DatabaseHelper.DATABASE_VERSION);
editor.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这是检查数据库是否已存在的示例?
public static boolean checkDataBase(Context c) {
File f = new File("/data/data/" + c.getPackageName() + "/databases/"
+ DATABASE_NAME);
if (!f.exists())
return false;
SQLiteDatabase checkDB = null;
try {
checkDB = SQLiteDatabase
.openDatabase("/data/data/" + c.getPackageName()
+ "/databases/" + DATABASE_NAME, null,
SQLiteDatabase.OPEN_READONLY);
checkDB.close();
} catch (SQLiteException e) {
e.printStackTrace();
}
return checkDB != null ? true : false;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3337 次 |
| 最近记录: |