2011-01-22 81 views
5

我正在用SQL開發一個簡單的Android應用程序。 我遵循以下指南 - http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/無法打開數據庫-Android

我試圖打開數據庫時出現錯誤。 這裏是我的DataBaseHelp.Java講座

public class DataBaseHelper extends SQLiteOpenHelper{ 

private static String DB_PATH = "/data/data/and.testDB/databases/"; 

private static String DB_NAME = "MyData"; 

private SQLiteDatabase myDataBase; 

private final Context myContext; 
public DataBaseHelper(Context context) { 

super(context, DB_NAME, null, 1); 
    this.myContext = context; 
} 
public void createDataBase() throws IOException{ 

boolean dbExist = checkDataBase(); 

if(dbExist){ 
    //do nothing - database already exist 
}else{ 
    this.getReadableDatabase(); 

    try { 

    copyDataBase(); 

    } catch (IOException e) { 

     throw new Error("Error copying database"); 

    } 
} 

} 

private boolean checkDataBase(){ 

SQLiteDatabase checkDB = null; 

try{ 
    String myPath = DB_PATH + DB_NAME; 
    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

}catch(SQLiteException e){ 

    //database does't exist yet. 

} 

if(checkDB != null){ 

    checkDB.close(); 

} 

return checkDB != null ? true : false; 
} 

private void copyDataBase() throws IOException{ 

//Open your local db as the input stream 
InputStream myInput = myContext.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 bytes from the inputfile to the 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(); 

} 

public void openDataBase() { 

//Open the database 
    String myPath = DB_PATH + DB_NAME; 
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
} 
@Override 
public synchronized void close() { 
     if(myDataBase != null) 
      myDataBase.close(); 
     super.close(); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 

這是我testDB.Java接收機類

public class testDB extends Activity { 
SQLiteDatabase myDataBase; 
public String[] gur = new String[4]; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    DataBaseHelper myDbHelper = new DataBaseHelper(this); 
    myDbHelper = new DataBaseHelper(this); 

    try { 

     myDbHelper.createDataBase(); 

} catch (IOException ioe) { 

    throw new Error("Unable to create database"); 

} 

try { 

    myDbHelper.openDataBase(); 
// Here is the problem-Can't open the database/ 
}catch(SQLException sqle){ 

    throw sqle; 

} 
    myDataBase = myDbHelper.getWritableDatabase(); 

    Cursor c = myDataBase.rawQuery("SELECT * FROM beer", null); 


if (c != null) { 
    if (c.moveToFirst()) { 
      for(int x=0;x< 1;x++) 
      { 

       gur[x] = (c.getString(c.getColumnIndex("name"))); 
       c.moveToNext(); 
      } 
} 
    Toast.makeText(this,gur[0],Toast.LENGTH_LONG).show(); 
} 


     } 
    } 

我使用SQLite數據庫瀏覽器創建的數據庫,創建了一個名爲「啤酒」表中,添加2行並將其放置在我的項目中的/ assests文件夾中。

請注意,我是SQL新手,我第一次使用它。我整天搜索一個答案,並找不到一個答案。

謝謝!

+0

http://stackoverflow.com/questions/9109438/how-to-use-existing-database-with -android-app/9109728#9109728 – 2012-09-07 04:11:56

回答

1

您需要在數據庫幫助程序(SQLiteOpenHelper的擴展)的onCreate方法中創建數據庫。在應用程序的上下文中創建數據庫之前,您對getReadableDatabase()的調用不會返回任何內容。

db.execSQL("CREATE TABLE " + TABLE_NAME 
+ " (_id INTEGER PRIMARY KEY AUTOINCREMENT," 
+ "foo TEXT, bar TEXT);"); 

沿着這些線的東西。顯然要填寫你自己的數據方案。

然後,您可以從資產文件夾中的數據庫中讀取數據,並使用sqlite命令將它們插入到數據庫中。

下面是我用上手教程:

http://www.devx.com/wireless/Article/40842

+0

我是否需要創建數據庫,甚至認爲我有外部數據庫(在資產中)?我有copyDatabase()函數來完成此操作。 – Tofira 2011-01-22 17:28:02

0

我建議使用其他教程。在設備之外創建數據庫是有點「有點」的。我從書中學到了它,但我認爲這tutorial使用正確的程序。

編輯: 好了,該教程是一種特殊情況下

最重要的是Android的例子和教程在那裏假設你想創建並在運行時填入你的數據庫,而不是使用和訪問獨立的,預加載的數據庫與您的Android應用程序。

我將向您展示的方法將您自己的SQLite數據庫文件從「assets」文件夾中複製到應用程序的系統數據庫路徑中,以便SQLiteDatabase API可以正常打開並訪問它。

3

在SQLite數據庫瀏覽器中打開你的數據庫,添加一個名爲 「android_metadata」 新表,

您可以執行下列SQL語句來做到這一點:

CREATE TABLE 「android_metadata」(「區域android_metadata「TEXT DEFAULT 'EN_US')

現在,在插入一個單行文本 'EN_US' 」「 表:

INSERT INTO 」android_metadata「 VALUES( 'EN_US')

然後,有必要將您的表的主要id字段重命名爲「_id」,以便Android知道綁定表的id字段的位置。

現在新的數據庫文件複製到你的項目資產的文件夾,它會工作.....