为什么此代码仅在第二次运行应用程序后才起作用?

时间:2011-10-11 16:25:03

标签: android sqlite

此活动的作用是将数据库从assets文件夹复制到应用程序数据库文件夹(如果应用程序正在运行第一个应用程序)。但是数据库仅在应用程序第二次运行后才会被复制!

package fifth3.sem;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


@SuppressWarnings("unused")
public class Splash extends Activity {
static DBAdapter db;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String destPath="/data/data/"+getPackageName()+"/databases/cryptdb2zx";
    File f=new File(destPath);
    File f2=new File("emptyfile");
    if(!f2.exists()){
        //do nothing
    {
        try {
            Log.w("akash", "file does not exist");
            CopyDB(getBaseContext().getAssets().open("cryptdb2"),new FileOutputStream(destPath));
            f2.createNewFile();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    } 
    db=new DBAdapter(this); 
    db.open();

    Thread t=new Thread(){
        public void run()
        {
            try{
            for(int i=0;i<5;i++){
                Thread.sleep(1000);
            }
            }
            catch(Exception e){

            }
            finally{
                startActivity(new Intent("login.screen"));
            }
        }
    };
    t.start();

}
public void CopyDB(InputStream inputStream,OutputStream outputStream)throws IOException{
    Log.w("akash", "copying");
    byte[] buffer=new byte[1024];
    int length;
    while((length=inputStream.read(buffer))>0){
        outputStream.write(buffer,0,length);
    }
    inputStream.close();
    outputStream.close();
    Log.w("akash", "copied");
}

}

1 个答案:

答案 0 :(得分:0)

在没有看到您的数据库适配器的情况下,我无法确定,但是它可能在第一次不起作用,因为您尝试在目录存在之前复制db。 通常,如果数据库适配器不存在,它将创建数据库。这将创建“数据库”目录。因此,当您打开新安装的应用程序时,该目录不存在,并且复制失败。但是,在复制逻辑之后,您立即创建数据库适配器,它(可能)创建数据库(以及包含它的目录。)因此,第二次运行时,复制成功。

这应该按照您的意愿运行(排序很重要):

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    db=new DBAdapter(this); 
    db.open();

    String destPath="/data/data/"+getPackageName()+"/databases/cryptdb2zx";
    File f=new File(destPath);
    File f2=new File("emptyfile");
    if(!f2.exists()){
        //do nothing
    {
        try {
            Log.w("akash", "file does not exist");
            CopyDB(getBaseContext().getAssets().open("cryptdb2"),new FileOutputStream(destPath));
            f2.createNewFile();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    } 

}