2013-10-30 2 views
-1

아래 코드를 사용하여 Assets 폴더에서 sqlite 데이터베이스를 복사했습니다. 내 응용 프로그램은 잘 작동하지만 열을 업데이트하려고 할 때 나에게 그렇게 할 수 없습니다. getwritabledatabase()도 설정했지만 여전히 동일한 문제입니다. 쓰기 모드로 변경하려면 어떻게해야합니까?자산 업데이트 문제 Sqlite 데이터베이스

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 

    } 

} 

글을 제대로 읽을 수 없습니다.

+1

스택 추적, logcat이란 무엇입니까? –

+0

오류가 없습니다. 나는 어떤 칼럼도 업데이트 할 수 없다. –

+0

@MayuriRuparel'getwritabledatabase'를 호출 할 때 오류가 있습니까? –

답변

0

데이터베이스를 열 때이 SQLiteDatabase.NO_LOCALIZED_COLLATORS에서 SQLiteDatabase.OPEN_READWRITE을 변경하십시오.

+0

나는 이미 이것을 시도했다 .. 작동하지 않는다. –

0

쓰기 불가능한 경로를 하드 코딩 한 것처럼 보입니다. 당신의 DataBaseHelper() 생성자에서 설정하는 것이 더 적절한 것 같다 :

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

가 그럼 그냥 새로 만들 데이터베이스를 덮어 DB_PATH를 사용하도록 copyDataBase() 방법을 변경 :

//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()를 호출하면 데이터베이스를 가져올 수 있습니다.

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

5 월이 도움이 될 것입니다.

관련 문제