2011-09-23 89 views
1

這是數據庫幫助程序類。我嘗試從存儲在mTable中的數據庫中獲取字符串。疑難解答SQLiteException(無法打開數據庫文件)

public class KamaDBAdapter extends SQLiteOpenHelper 
{ 
protected static final String TAG = "TAG"; 

private Context mContext; 
private SQLiteDatabase mDb; 
//private DataBaseHelper mDbHelper; 

private static String TABLE="mTable"; 
private static String DB_NAME="mdb12.db"; 
private static String ROW_ID="_id"; 
public static String ROW_QUOTES= "quote"; 
private String DB_PATH = "/data/data/com.android.android/databases/"; 

public KamaDBAdapter(Context context) 
{ 
super(context,DB_NAME,null,2); 
this.mContext = context; 
//mDb = new DataBaseHelper(mContext); 
} 
/*public KamaDBAdapter createDatabase() throws SQLException 
{ 
this.createDatabase(); 
return this; 
}*/ 

public void readDataBase() 
{ 
this.getReadableDatabase(); 



} 
public void openDataBase() throws SQLException{ 

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

} 

public void close() 
{ 
mDb.close(); 
} 
public String retriveData() 
{ 


Cursor mCursor = mDb.query(TABLE, new String[] {ROW_ID},null , null, null, null, null); 
//mCursor.moveToFirst(); 
String mReturn = mCursor.getString(mCursor.getColumnIndex(ROW_ID)); 

mCursor.close(); 
return mReturn; 


} 
public boolean checkdatabase() { 

    SQLiteDatabase mCheckDataBase = null; 
    try 
    { 
     String myPath = DB_PATH + DB_NAME; 
     mCheckDataBase = SQLiteDatabase.openDatabase(myPath, null,  

SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
    } 
    catch(SQLiteException mSQLiteException) 
    { 
     Log.e(TAG, "DatabaseNotFound " + mSQLiteException.toString()); 
    } 

    if(mCheckDataBase != null) 
    { 
     mCheckDataBase.close(); 
    } 
    return mCheckDataBase != null; 
} 
public void copydatabase() throws IOException { 

//Open your local db as the input stream 
InputStream myinput = mContext.getAssets().open(DB_NAME); 

// Path to the just created empty db 
String outfilename = DB_PATH + DB_NAME; 

//Open the empty db as the output stream 
OutputStream myoutput = new FileOutputStream(outfilename); 

// transfer byte to inputfile to outputfile 
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(); 

} 

@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 

} 

而主要活動代碼是。

public class DbActivity extends Activity { 
/** Called when the activity is first created. */ 
private static KamaDBAdapter mDbHelper=null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mDbHelper = new KamaDBAdapter(this); 
    TextView tv=(TextView)findViewById(R.id.text); 
    boolean b= mDbHelper.checkdatabase(); 
    if(b==true) 
    { 
    mDbHelper.readDataBase(); 
    try { 
     mDbHelper.openDataBase(); 
    } catch (SQLException e) { 

     e.printStackTrace(); 
    } 
    } 
    try { 
     mDbHelper.copydatabase(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     throw new Error("Unable to copy database"); 
    } 

    try { 
     mDbHelper.openDataBase(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    String s= mDbHelper.retriveData(); 
    tv.setText(s); 

} 
} 

我米得到錯誤:

09-23 17:29:17.872: ERROR/Database(2658): sqlite3_open_v2("/data/data/com.android.android/databases/mdb12.db", &handle, 2, NULL) failed 
09-23 17:29:17.882: ERROR/TAG(2658): DatabaseNotFound android.database.sqlite.SQLiteException: unable to open database file 

我怎樣才能解決呢?

+0

陽光明媚,這是一個可怕的標題。 – Mat

+0

那麼代碼不是更好 – ernazm

+0

抱歉,這個墊,但現在我感到刺激。 – Sunny

回答

0

應該是這樣:

DB_NAME="mdb12"; 

而且除非你正在爲android.com

DB_PATH = "/data/data/com.android.android/databases/"; 

可能是錯誤的。把正確的包名稱(你可以從你的清單文件檢查它)

0

應該

DB_NAME="mdb12.sqlite"; 

,而不是

DB_NAME="mdb12.db"; 
+0

這不工作我改變了擴展名:( – Sunny

+0

,但你最初創建「.sqlite」文件或只是重命名? –

+0

最初在sqlite瀏覽器中創建。 – Sunny

0

試試這一個,而不是......

公共無效readDataBase()

{

this.getReadableDatabase();

}

變化和嘗試........

公共無效readDataBase()

{

SQLiteDatabase db_Read = null; 

    db_Read = this.getReadableDatabase(); 
     db_Read.close(); 

}

+0

:((((不工作 – Sunny