【问题标题】:Using Pre-populated Database on SQLite database Android Studio [duplicate]在 SQLite 数据库 Android Studio 上使用预填充数据库 [重复]
【发布时间】:2016-01-27 14:56:30
【问题描述】:

在这里,我想将预填充的 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<String> getAllCategory() {
    List<String> AllCategoryList = new ArrayList<String>();
    List<String> AllCategIdList = new ArrayList<String>();

    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) 无法在 [9491ba7d73] 的第 30046 行打开文件 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/资产/question.db) - 10-28 07:18:38.989 2425-2425/gook.psikologikarakter E/SQLiteDatabase: 无法打开数据库'/Users/ever_ncn/Documents/Project/PsikologiKarakter/app/src/main/assets/question.db'。 android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(代码 14):无法打开数据库 在 android.database.sqlite.SQLiteConnection.nativeOpen(本机方法) 在 android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 在 android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 在 android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 在 android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 在 android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 在 android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806) 在 android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791) 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 在 android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) 在 gook.psikologikarakter.DatabaseHelper.DBExist(DatabaseHelper.java:65) 在 gook.psikologikarakter.DatabaseHelper.createDB(DatabaseHelper.java:52) 在 gook.psikologikarakter.DatabaseHelper.createDatabase(DatabaseHelper.java:48) 在 gook.psikologikarakter.MainActivity.onCreate(MainActivity.java:59) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 在 android.app.ActivityThread.access$800(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5257) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我不知道到底发生了什么,但我想我无法打开数据库文件。但我不知道该怎么办。请高手帮帮我。

之前谢谢。

【问题讨论】:

  • 您不能使用资产文件夹中的数据库。您需要在第一次运行时将数据库复制到 /data/data/YOUR_PACKAGE/databases/ 。这会有所帮助:stackoverflow.com/questions/513084/…
  • 是的先生,我的意思是,所以我的问题是如何在应用程序第一次启动时将数据库从资产文件夹复制到 data/data/your_package/databases/?
  • 我的朋友就像复制任何其他文件一样简单,您将使用 java。这是专门针对您的情况的:stackoverflow.com/a/20592481/1371041
  • 但是我得到了这个先生的错误:private String DATABASE_PATH= context.getApplicationInfo().dataDir + "/databases/";我收到错误“非法前向引用”
  • 我使用另一个模式代码来做到这一点,先生。先生,我使用此代码,private void copyDatabase(File dbFile) throws IOException { InputStream is = context.getAssets().open(DATABASE_NAME);输出流 os = new FileOutputStream(dbFile);字节[]缓冲区=新字节[1024]; while (is.read(buffer) > 0) { os.write(buffer); } os.flush(); os.close(); is.close(); }

标签: android database sqlite


【解决方案1】:
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() 上遇到错误;
猜你喜欢
  • 2015-12-27
  • 2011-01-25
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多