2011-01-22 34 views
5

Tôi đang phát triển một ứng dụng Android đơn giản với SQL. Tôi đã làm theo các hướng dẫn sau - http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/Không thể mở cơ sở dữ liệu-Android

Tôi gặp lỗi khi cố gắng mở cơ sở dữ liệu. Đây là tôi DataBaseHelp.Java Class-

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) { 
    } 
} 

Và đây là testDB.Java tôi class-

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


     } 
    } 

Tôi tạo ra cơ sở dữ liệu sử dụng cơ sở dữ liệu SQLite Browser, tạo ra một bảng có tên là "bia", nói thêm 2 hàng và đặt nó trong thư mục/assests trong dự án của tôi.

Xin lưu ý rằng tôi mới sử dụng SQL và đây là lần đầu tiên tôi sử dụng nó. Tôi đã tìm kiếm một câu trả lời cả ngày và không thể tìm thấy câu trả lời.

Cảm ơn!

+0

http://stackoverflow.com/questions/9109438/how-to-use-existing-database-with -android-app/9109728 # 9109728 –

Trả lời

1

Bạn cần tạo cơ sở dữ liệu trong phương thức onCreate của trình trợ giúp cơ sở dữ liệu của bạn (phần mở rộng của SQLiteOpenHelper). Cuộc gọi của bạn tới getReadableDatabase() sẽ không trả lại bất cứ điều gì cho đến khi một cơ sở dữ liệu được tạo ra trong ngữ cảnh của ứng dụng.

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

Điều gì đó dọc theo các dòng đó. Rõ ràng điền vào lược đồ dữ liệu của riêng bạn.

Sau đó, bạn có thể đọc dữ liệu từ cơ sở dữ liệu bạn có trong thư mục nội dung của bạn và chèn chúng vào cơ sở dữ liệu bằng các lệnh sqlite.

Dưới đây là một hướng dẫn mà tôi sử dụng để bắt đầu:

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

+0

Tôi có cần tạo một cơ sở dữ liệu, thậm chí nghĩ rằng tôi có một cơ sở dữ liệu bên ngoài (trong các tài sản)? Tôi có hàm copyDatabase() để làm điều đó. – Tofira

+0

Trong createDataBase bạn gọi getReadableDatabase() nếu cơ sở dữ liệu không tồn tại. Cuộc gọi đó sẽ thất bại mà không cần tạo trước một cơ sở dữ liệu. – Lunchbox

+0

Gọi getReadableDatabase() đã xảy ra lỗi, tôi đã xóa nó. Dù sao, copyDataBase() đã sao chép cơ sở dữ liệu từ các tài sản cho tôi. Tôi không thấy cách tạo cơ sở dữ liệu sẽ giúp ích gì. Bạn có thể giải thích? – Tofira

0

tôi đề nghị sử dụng một hướng dẫn khác. Để tạo ra một cơ sở dữ liệu bên ngoài các thiết bị là "một chút" có dây. Tôi đã học được nó từ một cuốn sách, nhưng tôi nghĩ rằng điều này tutorial sử dụng các thủ tục đúng.

Edit: Ok, hướng dẫn là một trường hợp đặc biệt

Hầu hết tất cả các ví dụ Android và hướng dẫn ra có giả sử bạn muốn tạo và cư cơ sở dữ liệu của bạn trong thời gian chạy và không sử dụng và truy cập vào một cơ sở dữ liệu được tải sẵn độc lập với ứng dụng Android của bạn.

Phương pháp tôi sẽ cho bạn thấy tệp cơ sở dữ liệu SQLite của bạn từ thư mục "asset" và sao chép vào đường dẫn cơ sở dữ liệu hệ thống của ứng dụng của bạn để API SQLiteDatabase có thể mở và truy cập bình thường.

3

Mở cơ sở dữ liệu của bạn trong trình duyệt của cơ sở dữ liệu SQLite và thêm một bảng mới có tên gọi "android_metadata",

bạn có thể thực hiện các câu lệnh SQL sau để làm điều đó:

CREATE TABLE "android_metadata" ("locale "tEXT DEFAULT 'en_US')

Bây giờ chèn một hàng duy nhất với các văn bản 'en_US' trong "android_metadata" bảng:

INSERT INTO "android_metadata" VALUES ('en_US')

Sau đó, cần phải đổi tên trường id chính của bảng thành "_id" để Android sẽ biết vị trí liên kết trường id của bảng của bạn.

tại sao chép các tập tin cơ sở dữ liệu mới vào thư mục các dự án tài sản của bạn, nó sẽ làm việc .....

Các vấn đề liên quan