android程序複製數據庫

一般項目中我們把db文件放到assert或者raw目錄下面,在程序第一次啓動的時候複製到私有目錄下面

?

在使用過程中,老是發現複製不成功,私有目錄下的db文件總是3072

?

<span style="color: #ff0000;">[b]後來發現應該是使用ContentProvider的原因,它會先創建一個空的db。[/b]
</span>


<br><img src="http://dl.iteye.com/upload/attachment/598512/8863f1d9-f38b-33f4-8262-dd5692375d79.jpg" alt="">

而我的程序在複製數據庫的時候會判斷私有目錄下是否有數據庫文件,如果有則不復制。

?

現在改爲用SharedPreferences一個字段判斷是否第一次複製。

<span style="color: #ff0000;">第一次複製數據庫的時候就算私有目錄下有db文件,也刪除。</span>


這樣就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);
}
}

?
?

?




<ul style="display:none;">
[*][url=http://dl.iteye.com/upload/attachment/598512/8863f1d9-f38b-33f4-8262-dd5692375d79.jpg]<img src='http://dl.iteye.com/upload/attachment/598512/8863f1d9-f38b-33f4-8262-dd5692375d79-thumb.jpg' class='magplus' title='點擊查看原始大小圖片' />[/url]


[*]大小: 14.3 KB

</ul>



[list]
[*][url=#]查看圖片附件[/url]

[/list]
發佈了1 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章