一般项目中我们把db文件放到assert或者raw目录下面,在程序第一次启动的时候复制到私有目录下面
在使用过程中,老是发现复制不成功,私有目录下的db文件总是3072
后来发现应该是使用ContentProvider的原因,它会先创建一个空的db。
而我的程序在复制数据库的时候会判断私有目录下是否有数据库文件,如果有则不复制。
现在改为用SharedPreferences一个字段判断是否第一次复制。
第一次复制数据库的时候就算私有目录下有db文件,也删除。
这样就ok了
代码如下:
public class CopyDataActivity extends Activity{
boolean needCopy = false;
SharedPreferences mSP = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.copy_data);
mSP = getSharedPreferences(Constants.PREFERENCES_NAME, MODE_PRIVATE);
needCopy = mSP.getBoolean("need_copy_data", true);
if(needCopy){
handler.post(copyPlanThread);
}else{
goToMain();
}
}
private void goToMain(){
mSP.edit().putBoolean("need_copy_data", false).commit();
startActivity(new Intent(CopyDataActivity.this,LoginActivity.class));
this.finish();
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int what = msg.what;
int arg1 = msg.arg1;
if(what==1){
//这里可以在页面显示复制进度什么的
Log.e("Copy","复制大小:"+arg1);
}else{
goToMain();
mSP.edit().putBoolean("need_copy_data", false).commit();
}
}
};
Runnable copyPlanThread = new Runnable() {
@Override
public void run() {
try{
copyDatabase();
}catch(Exception e){
e.printStackTrace();
}
}
};
private void copyDatabase() throws Exception{
Log.e("Copy","copy start");
File dbfile = new File(getFilesDir().getAbsolutePath() +File.separator+ "mydb.db";
File dir = dbfile.getParentFile();
if(dir.exists() == false){
dir.mkdirs();
}
//把contentprovider生成的db删除
if(dbfile.exists()){
dbfile.delete();
}
InputStream is = this.getResources().openRawResource(R.raw.library);
FileOutputStream fos = new FileOutputStream( dbfile);
byte[] buffer =new byte[1024];
int size = 0;
int length = 0; //字节
while( (length= is.read(buffer)) > 0){
fos.write(buffer,0,length);
size += length;
Message msg = new Message();
msg.what = 1;
msg.arg1 = size;
handler.sendMessage(msg);
}
fos.flush();
fos.close();
is.close();
Log.e("Copy","copy end");
Message msg = new Message();
msg.what = 0;
msg.arg1 = 0;
handler.sendMessage(msg);
}
}
- 大小: 14.3 KB
分享到:
相关推荐
3. **复制数据库到应用数据库目录** 因为`assets`目录下的文件无法直接由SQLite数据库API访问,我们需要在应用首次运行时将数据库文件复制到上述的数据库路径。这通常在`SQLiteOpenHelper`的`onCreate()`或`...
在Android开发中,有时我们需要将预置的数据库文件与应用一起发布,并在应用程序首次启动时将其复制到外部存储(如SD卡)或内部存储(内存)中,以便于后续的操作和使用。这样的需求通常出现在那些需要提供初始数据...
在Android平台上,数据库是应用程序存储结构化数据的重要方式。SQLite是一种轻量级的、嵌入式的、关系型数据库,它是Android系统默认支持的数据库系统。本文将深入探讨如何在Android设备上查看和导出SQLite数据库...
在Android应用开发中,数据库是存储和管理应用程序数据的关键组件。`SQLite Asset Helper`是一个流行的开源库,由Jake Wharton创建,它简化了在Android应用中处理SQLite数据库的工作流程,特别是涉及数据库初始化和...
在Android开发中,数据安全是至关重要的,尤其是当应用程序存储敏感用户信息时。"android 加密已创建的数据库"这个话题涉及到如何使用第三方库SQLCipher对已经存在的SQLite数据库进行加密,以增强数据的安全性。...
总之,在Android中从`assets`目录读取数据库涉及复制数据库文件、创建数据库帮助器、打开数据库并进行操作等步骤。通过这种方式,我们可以预先加载数据库,提供快速启动体验,或者在不联网的情况下使用预设的数据。...
- 调用`copyDatabase()`方法在应用启动时复制数据库,然后通过`getWritableDatabase()`或`getReadableDatabase()`打开数据库进行读写操作。 3. **使用SQLiteOpenHelper的实例进行数据操作**: - 在你的应用中,你...
在Android系统中,数据库是用于存储应用程序数据的重要组成部分。它通常使用SQLite,一个轻量级、关系型数据库管理系统,能够高效地处理大量的数据。本文将深入探讨如何通过命令行方式来访问Android设备上的数据库,...
2. **复制数据库文件**:在应用启动时或需要加载数据库时,我们需要将assets目录下的.db文件复制到Android的默认数据库路径(通常是/data/data/your_package_name/databases/)。可以使用InputStream和OutputStream...
2. **复制数据库文件**:在`SQLiteOpenHelper`的子类中,创建一个方法用于从`assets`目录复制数据库文件到`databases`目录。这里需要用到`Context`对象,可以通过`getApplication()`或者`getApplicationContext()`...
对于调试目的,可以使用adb(Android Debug Bridge)将数据库文件复制到本地。文件通常位于`/data/data/your.package.name/databases/your_database.db`路径下。 一旦你有了.db文件,可以在计算机上使用SQLite...
Fragment是Android应用程序的一个模块化组件,它可以独立于Activity存在,并可以在多个Activity之间复用。在这个Demo中,每个号码归属地查询的结果都由一个Fragment来表示,ViewPager将这些Fragment进行组合和管理...
首先,让我们详细讨论如何在Android中复制数据库到SD卡。在Android 6.0(API级别23)之前,应用程序可以直接写入SD卡,但从那时起,为了增强用户数据安全,Google引入了运行时权限管理系统。因此,现在你需要请求`...
在Android应用开发中,数据库是存储用户数据和应用程序信息的重要工具。SQLite是一个轻量级的、关系型的数据库,它是Android系统内置的数据库系统,适用于本地数据存储。本篇文章将详细探讨如何在Android应用中实现...
在这种情况下,可以使用`Context`的`openFileInput()`和`openFileOutput()`方法打开数据库文件,或者使用`AssetManager`从应用资源中复制数据库文件。 例如,当从应用的assets目录加载数据库时,可以这样操作: ``...
由于这个目录是受保护的,你需要通过ADB(Android Debug Bridge)连接到设备,并使用`adb pull`命令将数据库文件复制到电脑上。例如: ``` adb pull /data/data/your_package_name/databases/your_database.db /...
在Android开发中,SQLite是一个重要的组成部分,它是轻量级的关系型数据库,被广泛用于存储应用程序中的数据。SQLite3是SQLite的第三个主要版本,它提供了高效、可靠的数据库操作能力。在这个"Android 数据库操作...
SQLite是一个轻量级的数据库系统,它是Android内置的数据库,用于应用程序存储结构化数据。本文将深入探讨如何在Android中进行数据库的导入与导出,以及如何利用工具SQLiteSpy对SQLite数据库进行操作。 首先,我们...
在Android应用开发中,数据库是存储和管理应用程序数据的关键组件。当应用的数据库需要更新以适应新功能或改进的数据结构时,如何优雅地进行数据库升级并同时保留原有的用户数据成为一个重要的问题。本篇文章将深入...
在Android平台上,开发人员经常需要处理数据存储,包括将数据库文件移动到外部存储(如SD卡)以及在界面上展示应用程序图标的小红点等角标信息。这份源码示例涵盖了这两个主题,提供了关于Android高级应用开发的知识...