Đầu tiên cần lưu ý một số điểm.
-
1 - bạn đã nói rằng tệp là FoodDB.db nhưng sau đó nói rằng cơ sở dữ liệu được gọi là foodDatabase.db . Tên cơ sở dữ liệu là tên tệp. Như vậy, ví dụ sau sử dụng FoodDB.db dưới dạng tệp nằm trong phần tử (bạn có thể đổi tên tệp khi sao chép từ phần tử nhưng tôi đã không thực hiện điều đó trong câu trả lời này.)
-
2 - Bạn không cần Trình trợ giúp cơ sở dữ liệu và ví dụ không sử dụng Trình trợ giúp.
Đó là hai phần:-
-
1) Truy cập cơ sở dữ liệu để trích xuất dữ liệu cho ListView. Trong ví dụ sau, điều này được sao chép từ nội dung sang vị trí cơ sở dữ liệu chuẩn ( / data / data / the_package / databases / the_database_name ).
- Giả định đã được đưa ra rằng sau khi được sao chép từ nội dung, cơ sở dữ liệu sau đó sẽ được sử dụng (tức là nó được sao chép một lần trong suốt thời gian tồn tại của Ứng dụng).
-
2) Hiển thị dữ liệu được trích xuất (thu được dưới dạng Con trỏ) trong ListView.
Để thực hiện 2, bạn sẽ cần bố trí bao gồm một ListView, như vậy bố cục sau đã được sử dụng. activity_main.xml :-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="fooddb.so49328656populatelistview.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
<ListView
android:id="@+id/foodlist"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
- Lưu ý
tools:context="fooddb.so49328656populatelistview.MainActivity"
sẽ phải phản ánh gói của BẠN
Trình trợ giúp cơ sở dữ liệu - Không được sử dụng như đã cảnh báo
Hoạt động gọi MainActivity.java (xem ghi chú):-
public class MainActivity extends AppCompatActivity {
static final String DBNAME = "FoodDB.db";
static final String DBASSETPATH = "databases/" + DBNAME;
static final String FOODTABLE = "dataset";
static final String FOODCOLUMN = "Food";
static final String IDCOLUMN = "ID";
ListView mFoodList;
SQLiteDatabase mDB;
SimpleCursorAdapter mSCA;
Cursor mCsr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFoodList = (ListView) this.findViewById(R.id.foodlist);
mDB = openFoodDB();
if (mDB != null) {
mCsr = mDB.query(FOODTABLE,
new String[]{IDCOLUMN + " AS _id",
FOODCOLUMN
},
null,null,null,null,null);
mSCA = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1,mCsr,
new String[]{FOODCOLUMN},
new int[]{android.R.id.text1},0);
mFoodList.setAdapter(mSCA);
} else {
Toast.makeText(this,"Unable to open Database.",Toast.LENGTH_LONG);
}
}
private SQLiteDatabase openFoodDB() {
String dbpath = this.getDatabasePath(DBNAME).getPath();
if (this.getDatabasePath(DBNAME).exists()) {
Log.d("OPENFOODDB","Opening already existing Database");
return SQLiteDatabase.openDatabase(dbpath,null,SQLiteDatabase.OPEN_READWRITE);
}
InputStream is;
byte[] buffer;
FileOutputStream db;
try {
is = this.getAssets().open(DBASSETPATH);
buffer = new byte[is.available()];
is.read(buffer);
is.close();
} catch (Exception e) {
e.printStackTrace();
Log.d("OPENFOODDB","Unable to locate or buffer input from assets " + DBASSETPATH);
return null;
}
// Just in case the databases directory doesn't exist create it.
File dbmkdir = (this.getDatabasePath(DBNAME)).getParentFile();
dbmkdir.mkdirs();
try {
db = new FileOutputStream(this.getDatabasePath(DBNAME).getPath());
} catch (Exception e) {
e.printStackTrace();
Log.d("OPENFOODDB","Unable to create outputstream for DB at path " + dbpath);
try {
is.close();
} catch (Exception e2) {
}
return null;
}
try {
db.write(buffer);
db.flush();
db.close();
is.close();
} catch (Exception e) {
Log.d("OPENFOODDB","Failed to copy asset to DB");
e.printStackTrace();
return null;
}
return SQLiteDatabase.openDatabase(dbpath,null,SQLiteDatabase.OPEN_READWRITE);
}
}
Ghi chú
-
openFoodDB
phương thức trả về SQLiteDatabase sau khi sao chép nếu từ tệp tài sản nếu cơ sở dữ liệu không tồn tại. Phương thức sẽ trả về null nếu có vấn đề.- nếu cơ sở dữ liệu tồn tại thì nhật ký sẽ chứa thông báo như
D/OPENFOODDB: Opening already existing Database
- sẽ không có thông báo nhật ký nếu cơ sở dữ liệu đã được sao chép từ tệp nội dung và được mở thành công. Tin nhắn sẽ chỉ được ghi lại nếu có sự cố.
- nếu ví dụ:nếu tệp nội dung bị thiếu thì bạn sẽ nhận được thông báo trong nhật ký như
D/OPENFOODDB: Unable to locate or buffer input from assets databases/FoodDB.db
điều này sẽ được đặt trước bằng một dấu vết ngăn xếp
- nếu cơ sở dữ liệu tồn tại thì nhật ký sẽ chứa thông báo như
ví dụ. :-
03-16 22:17:04.008 1529-1529/? W/System.err: java.io.FileNotFoundException: databases/FoodDB.db
03-16 22:17:04.008 1529-1529/? W/System.err: at android.content.res.AssetManager.openAsset(Native Method)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.content.res.AssetManager.open(AssetManager.java:315)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.content.res.AssetManager.open(AssetManager.java:289)
03-16 22:17:04.008 1529-1529/? W/System.err: at fooddb.so49328656populatelistview.MainActivity.openFoodDB(MainActivity.java:63)
03-16 22:17:04.008 1529-1529/? W/System.err: at fooddb.so49328656populatelistview.MainActivity.onCreate(MainActivity.java:37)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.app.Activity.performCreate(Activity.java:5008)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.app.ActivityThread.access$600(ActivityThread.java:130)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.os.Looper.loop(Looper.java:137)
03-16 22:17:04.008 1529-1529/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:4745)
03-16 22:17:04.008 1529-1529/? W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
03-16 22:17:04.008 1529-1529/? W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
03-16 22:17:04.008 1529-1529/? W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-16 22:17:04.008 1529-1529/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-16 22:17:04.008 1529-1529/? W/System.err: at dalvik.system.NativeStart.main(Native Method)
- CursorAdapter yêu cầu một cột có tên cụ thể là _id do đó việc sử dụng
IDCOLUMN + " AS _id"
.
Kết quả:-