2011-09-23 88 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