android studio sqlitedatabase,在SQLite数据库Android Studio上使用预填充数据库
本問題已經有最佳答案,請猛點這里訪問。
在這里,我想使用我預先填充的SQLite數據庫到我的Android應用程序。 因此,首次運行時,它會自動從assets文件夾中復制數據庫,并在我的Android應用程序中將其用作數據庫。
到目前為止,我已經做了這些事:
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String MyVillageSoftware ="MyVillageSoftware";
public static final String table_Question ="table_question";
private static final String DATABASE_PATH="/Users/ever_ncn/Documents/Project/PsikologiKarakter/app/src/main/assets/";
private static final String DATABASE_NAME="question.db";
//TOL for transaction Coloumn
SQLiteDatabase db;
Context context;
private static final String TAG = DatabaseHelper.class.getSimpleName();
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
this.context=context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
public void createDatabase(){
createDB();
}
public void createDB(){
boolean dbExist = DBExist();
if(!dbExist){
this.getReadableDatabase();
copyDBFromResource();
}
}
private boolean DBExist(){
SQLiteDatabase db = null;
try{
String databasePath = DATABASE_PATH+DATABASE_NAME;
db=SQLiteDatabase.openDatabase(databasePath, null,
SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
}catch(SQLiteException e){
Log.e("SqlHelper","Database nda ada babi");
}
if(db != null){
db.close();
}return db != null ? true : false;
}
private void copyDBFromResource(){
InputStream inStream=null;
OutputStream outStream = null;
String dbFilePath=DATABASE_PATH+DATABASE_NAME;
try{
inStream=context.getAssets().open(DATABASE_NAME);
outStream=new FileOutputStream(dbFilePath);
byte[] buffer = new byte[1024];
int length;
while((length=inStream.read(buffer))>0){
outStream.write(buffer, 0 , length);
}
outStream.flush();
outStream.close();
inStream.close();
}catch (IOException e){
throw new Error("Problem cuk");
}
}
public List getAllCategory() {
List AllCategoryList = new ArrayList();
List AllCategIdList = new ArrayList();
String selectQuery ="SELECT * FROM" + table_Question;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
String Id = cursor.getString(0);
String A = cursor.getString(1);
String B = cursor.getString(2);
String C = cursor.getString(3);
String D = cursor.getString(4);
String aExplain = cursor.getString(5);
String bExplain = cursor.getString(6);
String cExplain = cursor.getString(7);
String dExplain = cursor.getString(8);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return AllCategoryList;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS" + table_Question);
onCreate(db);
}
}
但我得到一個這樣的錯誤信息:
10-28 07:18:38.988 2425-2425/gook.psikologikarakter E/SQLiteLog﹕ (14) cannot open file at line 30046 of [9491ba7d73]
10-28 07:18:38.988 2425-2425/gook.psikologikarakter E/SQLiteLog﹕ (14) os_unix.c:30046: (2) open(/Users/ever_ncn/Documents/Project/PsikologiKarakter/app/src/main/assets/question.db) -
10-28 07:18:38.989 2425-2425/gook.psikologikarakter E/SQLiteDatabase﹕ Failed to open database '/Users/ever_ncn/Documents/Project/PsikologiKarakter/app/src/main/assets/question.db'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
at gook.psikologikarakter.DatabaseHelper.DBExist(DatabaseHelper.java:65)
at gook.psikologikarakter.DatabaseHelper.createDB(DatabaseHelper.java:52)
at gook.psikologikarakter.DatabaseHelper.createDatabase(DatabaseHelper.java:48)
at gook.psikologikarakter.MainActivity.onCreate(MainActivity.java:59)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
我不知道到底發生了什么,但我想我無法打開數據庫文件。 但我不知道該怎么辦。 請高手幫幫我。
謝謝你。
您不能使用assets文件夾中的數據庫。您希望在首次運行時將數據庫復制到/ data / data / YOUR_PACKAGE / databases /。這將有所幫助:stackoverflow.com/questions/513084/…
是的先生,我的意思是,所以我的問題是如何在第一次啟動應用程序時將數據庫從assets文件夾復制到data / data / your_package / databases /?
我的朋友就像復制你使用java的任何其他文件一樣簡單。以下是專門針對您的案例:stackoverflow.com/a/20592481/1371041
但是我在這個先生上得到了錯誤:private String DATABASE_PATH = context.getApplicationInfo()。dataDir +"/ databases /";我收到錯誤"非法轉發參考"
@ChallengeAccepted謝謝先生,它運作良好
很高興解決了你的問題。至于"非法前向引用"你確定它是在構造函數中嗎?你做了什么來解決你的錯誤?
我使用另一個模式代碼來做那個先生。我使用此代碼先生,private void copyDatabase(File dbFile)拋出IOException {InputStream is = context.getAssets()。open(DATABASE_NAME); OutputStream os = new FileOutputStream(dbFile); byte [] buffer = new byte [1024]; while(is.read(buffer)> 0){os.write(buffer); os.flush(); os.close(); is.close(); }
private static final String DATABASE_PATH="/Users/ever_ncn/Documents/Project/PsikologiKarakter/app/src/main/assets/";
這是本地文件系統上的路徑,而不是運行時設備上文件的路徑。 使用getResources().getAssets().openFile(...)獲取文件的InputStream。
代碼就像這先生一樣?。context.getResources()getAssets()中openFile(DATABASE_NAME)。 但我在openFile()上遇到錯誤;
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的android studio sqlitedatabase,在SQLite数据库Android Studio上使用预填充数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孩子对不起,是我们带你们走进了地狱
- 下一篇: 睡眠音频分割及识别问题(十一)--基于A