Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自资产更新问题Android的Sqlite数据库_Android_Sqlite - Fatal编程技术网

来自资产更新问题Android的Sqlite数据库

来自资产更新问题Android的Sqlite数据库,android,sqlite,Android,Sqlite,我已经使用下面的代码从Assets文件夹复制了sqlite数据库。我的应用程序运行良好,但当我想更新任何专栏时,它不允许我这样做。我也设置了getwritabledatabase(),但仍然存在相同的问题。我应该怎么做才能将其更改为可写模式 public class DataBaseHelper extends SQLiteOpenHelper { private static String TAG = "DataBaseHelper"; private static String DB

我已经使用下面的代码从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

    } 

} 

我能够正确地阅读而不能写入。

尝试更改此
SQLiteDatabase。在此
SQLiteDatabase中打开\u READWRITE
。打开数据库时没有本地化的\u COLLATORS。

看起来您硬编码了一个可能无法写入的路径。似乎更适合在
DataBaseHelper()构造函数中设置:

DB_PATH = getWritableDatabase().getPath();
getWritableDatabase().close();
然后将
copyDataBase()
方法更改为仅使用DB\u 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(); 
}
//从资产复制数据库
私有void copyDataBase()引发IOException
{ 
InputStream mInput=mContext.getAssets().open(DB_NAME);
OutputStream mOutput=新文件OutputStream(DB_路径);//0)
{ 
mOutput.write(mBuffer,0,最大长度);
} 
mOutput.flush();
mOutput.close();
mInput.close();
}

不要再使用
openDataBase()
方法。只需在DataBaseHelper实例上调用getWriteableDatabase()即可获取数据库。

您的代码看起来正常。我所做的工作如下:

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(); 
    }

这可能会对您有所帮助。

错误是什么,堆栈跟踪,logcat?没有错误。我只是无法更新任何列。@MayuriRuparel您在调用
getwritabledatabase
时是否遇到任何错误?