-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

看起来您硬编码了一条可能不可写的路径。似乎更适合在您的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 回答
0

当您打开数据库时,请尝试SQLiteDatabase.OPEN_READWRITE在此更改。SQLiteDatabase.NO_LOCALIZED_COLLATORS

于 2013-10-30T19:50:45.030 回答
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 回答