Java 如何将我的数据库打包到我的应用程序中?
我有一个SQLite数据库,这是我的应用程序所必需的。当我在我的电脑上用模拟器运行它时,它工作得非常完美。当我在手机上运行它时,它崩溃了,因为该方法返回null,因为它无法连接到数据库 这就是我准备数据库的地方。但是,我不确定我该如何将其与我的应用程序打包在一起 这是我的DatabaseHandler.java:Java 如何将我的数据库打包到我的应用程序中?,java,android,sqlite,Java,Android,Sqlite,我有一个SQLite数据库,这是我的应用程序所必需的。当我在我的电脑上用模拟器运行它时,它工作得非常完美。当我在手机上运行它时,它崩溃了,因为该方法返回null,因为它无法连接到数据库 这就是我准备数据库的地方。但是,我不确定我该如何将其与我的应用程序打包在一起 这是我的DatabaseHandler.java: package com.example.brad.myapplication; import android.accounts.Account; import android.da
package com.example.brad.myapplication;
import android.accounts.Account;
import android.database.DatabaseUtils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import static android.database.DatabaseUtils.dumpCursorToString;
/**
* Created by Brad on 19/07/2014.
*/
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "carsGrid",
TABLE_CARS = "cars ",
KEY_ID = "id",
KEY_POSTCODE = "postcode",
KEY_ADDRESS = "address",
KEY_IMAGE = "image";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_CARS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_ADDRESS + " TEXT,"+ KEY_POSTCODE + " TEXT," + KEY_IMAGE + " TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CARS);
onCreate(db);
}
public void createCar(Car car) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ADDRESS, car.get_address());
values.put(KEY_POSTCODE, car.get_postcode());
values.put(KEY_IMAGE, car.get_image());
db.insert(TABLE_CARS, null, values);
db.close();
}
public Car getCar(int id) {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query(TABLE_CARS, new String[] {KEY_ID, KEY_IMAGE, KEY_ADDRESS, KEY_POSTCODE}, KEY_ID + "=?", new String[] { String.valueOf(id)}, null,null,null,null);
if (cursor != null)
cursor.moveToFirst();
Car car = new Car(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2),cursor.getString(3));
return car;
}
public int getCarCount() {
//SELECT * FROM CARS
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CARS, null);
cursor.close();
return cursor.getCount();
}
public String getRandomImageKey() {
//SELECT * FROM CARS
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT " + KEY_ID + "," + KEY_IMAGE + " FROM " + TABLE_CARS + " ORDER BY RANDOM() LIMIT 1", null);
int columnIndex = cursor.getColumnIndex(KEY_ID);
String toReturn = cursor.getString(columnIndex);
return toReturn;
}
public Car getCurrentCar() {
SQLiteDatabase db = getWritableDatabase();
String sql = "SELECT " + KEY_ID + "," + KEY_ADDRESS + "," + KEY_POSTCODE + "," + KEY_IMAGE + " FROM " + TABLE_CARS + " ORDER BY RANDOM() LIMIT 1";
Cursor cursor = db.rawQuery(sql, new String[] {});
Car car = null;
try {
if (cursor.moveToFirst()) {
car = new Car(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3));
}
}
finally {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
db.close();
}
return car;
}
}
如何将我的数据库打包到我的应用程序中
在应用程序第一次运行时从资产中解压数据库。Hi@commonware,感谢您的帖子,我假设super(context,database\u NAME,context.getExternalFilesDir(null).getAbsolutePath(),null,database\u VERSION)正确吗;是否进入MyActivity.java?@BradlySpicer:没有,但在您的
sqliteAssetThelper
子类中仍保留了该文件的精简版本:很抱歉,这会变得单调乏味,有点小问题@BradlySpicer:首先,您不是在扩展SQLiteAssetHelper
。这对于使用SQLiteAssetHelper
@BradlySpicer非常重要:我建议您提出一个新的堆栈溢出问题,您可以提供源代码(作为实际文本,而不是屏幕截图)和堆栈跟踪(作为实际文本,而不是屏幕截图),以便堆栈溢出社区可以更好地帮助您。