0

最初の質問: 読み取りたいデータベースがあり、最初にロードしようとしたとき以外はエラー メッセージが表示されないため、正しくロードされていると確信しています。エラー、それはなぜですか?これは、デバイス上のアプリに何らかの影響を与えますか?

2 番目の質問: アプリをロードしてから [戻る] ボタンをクリックしてアプリを終了すると、このエラーが発生します。

08-28 22:58:16.504: E/SQLiteDatabase(361): close() was never explicitly called on database '/data/data/com.example.databaseexample/databases/library_dev.db'

コードのどこかで適切に閉じていませんか? よろしくお願いします。

コード:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DataBaseHelper myDbHelper = new DataBaseHelper(this);

    try{
        myDbHelper.createDataBase();
    }catch(IOException ioe){
        throw new Error("You f'd up, the database wasn't created *crys*");
    }

    try{
        myDbHelper.openDatabase();
    }catch(SQLException sqle){
        throw sqle;
    }
}

public void createListFromDB() {
    // TODO Auto-generated method stub


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
}

私が使用する他のクラスは次のとおりです。

public class DataBaseHelper extends SQLiteOpenHelper{

private static String DB_PATH = "/data/data/com.example.databaseexample/databases/";    
private static String DB_NAME = "library_dev.db"; 
private SQLiteDatabase myDataBase;  
private final Context myContext;


public DataBaseHelper(Context c){
    super(c, DB_NAME, null, 1);
    this.myContext = c;
}

public void createDataBase() throws IOException{

    boolean dbExist =  checkDataBase();

    if(dbExist){
        //do nothing since the database already exist.
    }
    else{
        this.getReadableDatabase();

        try{
            copyDataBase();
        }catch(IOException e){
            throw new Error("Error Copying Database");
        }
    }       
}

private boolean checkDataBase(){

    SQLiteDatabase checkDB = null;

    try{
        String myPath = DB_PATH + DB_NAME;
        checkDB =  SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }catch(SQLiteException e){
        //database doesn't exist yet.
    }

    if(checkDB != null){
        checkDB.close();
    }

    return checkDB != null ? true : false;
}

private void copyDataBase()throws IOException{

    //Opens your local db as the input stream.
    InputStream myInput =  myContext.getAssets().open(DB_NAME);

    //Path to the just created empty DB.
    String outFileName =  DB_PATH + DB_NAME;

    //Opens the empty DB as the output stream.
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfiles.
    byte[] buffer = new byte[1024];
    int length;
    while((length = myInput.read(buffer)) > 0){
        myOutput.write(buffer, 0, length);
    }

    //Close the Streams.
    myOutput.flush();
    myOutput.close();
    myInput.close();        
}

public void openDatabase() throws SQLException{

    //Open the database.
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}

@Override
public synchronized void close(){
    if(myDataBase != null){
        myDataBase.close();
    }
}

@Override
public void onCreate(SQLiteDatabase db){

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

}

}
4

1 に答える 1

1

質問1

初めてコードを作成するときにまだ存在しないデータベースを開こうとしているため、このエラーが発生しています。この場合、新しいデータベースを作成します(入力ファイルからコピーします)。最初にアプリケーションを起動してから、すべての電話でこのエラーが発生します.作成するまでデータベースはありません..ところで、これはデータベースを処理するための非常に悪いアプローチです.

質問2

これは、データベースを明示的に閉じていないために発生します。あなたのonDestroy()メソッドでそれを行う必要があります..これをあなたのDataBaseHelper

public void closeDatabase() throws SQLException {
    // Close the database.
    myDataBase.close();
}

このメソッドは、 内onDestroy()で呼び出す必要がありますMainActivity。これがお役に立てば幸いです

更新 このチュートリアルを確認してください。SQLiteの処理方法が非常によく説明されています

于 2012-08-28T23:27:37.837 に答える