Почему этот код работает только после второго запуска приложения? - PullRequest
0 голосов
/ 11 октября 2011

Эта операция выполняет копирование базы данных из папки ресурсов в папку базы данных приложений, если приложение запущено в первый раз. Но база данных копируется только после второго запуска приложения!

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 голосов
/ 11 октября 2011

Не видя вашего адаптера базы данных, я не могу быть уверен, однако, скорее всего, он не сработает с первого раза, потому что вы пытаетесь скопировать БД до того, как каталог существует. Обычно адаптер базы данных создает базу данных, если она не существует. Это создаст каталог «Базы данных». Таким образом, когда вы открываете только что установленное приложение, каталог не существует и копирование не выполняется. Однако сразу после логики копирования вы создаете адаптер db, и он (вероятно) создает базу данных 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();
        }
    }
    } 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...