-1

以下のコードを使用して、Assets フォルダーから sqlite データベースをコピーしました。私のアプリはうまく機能しますが、列を更新したいときにそれを行うことができません。getwritabledatabase() も設定しましたが、それでも同じ問題です。書き込み可能モードに変更するにはどうすればよいですか?

public class DataBaseHelper extends SQLiteOpenHelper 
{ 
private static String TAG = "DataBaseHelper";  
private static String DB_PATH = "";  
private static String DB_NAME ="Quotes"; 
private SQLiteDatabase mDataBase;  
private final Context mContext; 

public DataBaseHelper(Context context)  
{ 
    super(context, DB_NAME, null, 1);
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
    this.mContext = context; 
}    

public void createDataBase() throws IOException 
{ 


    boolean mDataBaseExist = checkDataBase(); 
    if(!mDataBaseExist) 
    { 
        super.getWritableDatabase(); 
        this.close(); 
        try  
        { 
            //Copy the database from assests 
            copyDataBase(); 
            Log.e(TAG, "createDatabase database created"); 
        }  
        catch (IOException mIOException)  
        { 
            throw new Error("ErrorCopyingDataBase"); 
        } 
    } 
} 

    private boolean checkDataBase() 
    { 
        File dbFile = new File(DB_PATH + DB_NAME); 
        //Log.v("dbFile", dbFile + "   "+ dbFile.exists()); 
        return dbFile.exists(); 
    } 

    //Copy the database from assets 
    private void copyDataBase() throws IOException 
    { 
        InputStream mInput = mContext.getAssets().open(DB_NAME); 
        String outFileName = DB_PATH + DB_NAME; 
        OutputStream mOutput = new FileOutputStream(outFileName); 
        byte[] mBuffer = new byte[1024]; 
        int mLength; 
        while ((mLength = mInput.read(mBuffer))>0) 
        { 
            mOutput.write(mBuffer, 0, mLength); 
        } 
        mOutput.flush(); 
        mOutput.close(); 
        mInput.close(); 
    } 

    //Open the database, so we can query it 
    public boolean openDataBase() throws SQLException 
    { 
        String mPath = DB_PATH + DB_NAME; 
        //Log.v("mPath", mPath); 
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.OPEN_READWRITE); 

        return mDataBase != null; 
    }



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

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    } 

} 

ちゃんと読めるけど書けない。

4

3 に答える 3

0

あなたのコードは大丈夫です。私がやったことは次のとおりです:

public class DataBaseHelper extends SQLiteOpenHelper{
    /*
     * Global declaration of variables.
     */
    private final Context myContext;
    private static String DB_PATH = "";
    private static final String DATABASE_NAME = "Quotes";
    private static final int DATABASE_VERSION = 1;

    static SQLiteDatabase sqliteDataBase;

    public DataBaseHelper(Context context) {    
        super(context, DATABASE_NAME, null ,DATABASE_VERSION);
        this.myContext = context;
        //The Android's default system path of your application database.
        DB_PATH =  myContext.getDatabasePath(DATABASE_NAME).getPath();
    }

    public void createDataBase() throws IOException{
        boolean databaseExist = checkDataBase();

        if(databaseExist){
        }else{
            this.getWritableDatabase();         
            copyDataBase(); 
        }
    }

    public boolean checkDataBase(){
        File databaseFile = new File(DB_PATH);
        return databaseFile.exists();        
    }

    private void copyDataBase() throws IOException{ 
        InputStream myInput = myContext.getAssets().open(DATABASE_NAME); 
        String outFileName = DB_PATH;
        OutputStream myOutput = new FileOutputStream(outFileName); 
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close(); 
    }

    public void openDataBase() throws SQLException{      
        String myPath = DB_PATH;
        sqliteDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);  
    }

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

これがあなたを助けますように。

于 2014-03-01T06:09:30.323 に答える
0

書き込み可能でない可能性のあるパスをハードコーディングしたようです。DataBaseHelper()コンストラクターで設定する方が適切と思われます。

DB_PATH = getWritableDatabase().getPath();
getWritableDatabase().close();

次に、copyDataBase()DB_PATH を使用して新しく作成したデータベースを上書きするようにメソッドを変更します。

//Copy the database from assets 
private void copyDataBase() throws IOException 
{ 
    InputStream mInput = mContext.getAssets().open(DB_NAME); 
    OutputStream mOutput = new FileOutputStream(DB_PATH); // <- Just DB_PATH
    byte[] mBuffer = new byte[1024]; 
    int mLength; 
    while ((mLength = mInput.read(mBuffer))>0) 
    { 
        mOutput.write(mBuffer, 0, mLength); 
    } 
    mOutput.flush(); 
    mOutput.close(); 
    mInput.close(); 
}

openDataBase()もうメソッドを使用しないでください。データベースを取得するには、DataBaseHelper インスタンスで getWriteableDatabase() を呼び出すだけです。

于 2014-02-24T03:04:30.303 に答える