android - 如何使用 ORMLite Assets 中可用的数据库

标签 android ormlite

我在assets 文件夹中有一个数据库文件,当用户安装此程序时,在第一次程序启动器中我会将数据库从assets 复制到databases 程序

这是我的代码:

private static final String DATABASE_NAME= "data.db";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config);
    this.myContext = context;
}

/************************************************
 * Suggested Copy/Paste Done
 ************************************************/

@Override
public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) {
    createDataBase();
}

public void createDataBase(){
    boolean dbExist = checkDataBase();
    if(!dbExist){
        try {
            copyDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private boolean checkDataBase(){
    SQLiteDatabase checkDB = null;
    try{
        String myPath = myContext.getDatabasePath(DATABASE_NAME).getPath();
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }catch(SQLiteException e){
        e.printStackTrace();
    }

    if(checkDB != null){
        checkDB.close();
    }
    return checkDB != null;
}
private void copyDataBase() throws IOException{
    InputStream myInput = myContext.getAssets().open(DATABASE_NAME);
    String outFileName = myContext.getDatabasePath(DATABASE_NAME).getPath();
    File f = new File(outFileName);
    f.getParentFile().mkdirs();
    f.createNewFile();
    OutputStream myOutput = new FileOutputStream(f);

    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

我检查了设备中的databases 文件夹,看到它有data.db 文件,但这个文件没有表。

我用来复制数据的代码已经运行。

为什么 data.db 是错误的?


UPDATED:

@DatabaseTable(tableName = "english")
public class Topic {
    @DatabaseField(generatedId = true, columnName = "id")
    private int id;
    @DatabaseField(columnName = "title")
    private String title;
    @DatabaseField(columnName = "question")
    private String question;
    @DatabaseField(columnName = "answer")
    private String answer;
    @DatabaseField(columnName = "audio_url")
    private String audioUrl;
    @DatabaseField(columnName = "local_url")
    private String localUrl;

    public Topic() {
    }
}
CREATE TABLE `english` (
    `id`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    `title` NVARCHAR,
    `question`  NVARCHAR,
    `answer`    NVARCHAR,
    `audio_url` NVARCHAR,
    `local_url` NVARCHAR
);

最佳答案

什么时候

super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config);

被称为data.db 已经创建。这样 onCreate 就不会被调用。 你不应该把 createDataBase 放在这里。

我想你可以把它放在 getWritableDatabasegetDao 函数中。

关于android - 如何使用 ORMLite Assets 中可用的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885131/

相关文章:

java - 在 Android 上捕获和拦截 ACTION_SEND Intent

android - 检查查询是否在 sqlite for Android 中成功

java - 如何从 NavDrawer 中的项目单击开始新 Activity

android - Cordova 应用程序在新应用程序版本中保留本地存储数据吗?

java - 基本的 ORMLite 数据库问题

android - 可以在应用程序类中创建 ORMLite 数据库助手吗?

java - GSON转Ormlite国外 Collection

android - ORMLite:查询空的外部字段

android - 未显示首选项 - 首选项 fragment

android - 我需要 getter 和 setter 以及额外的实体构造函数吗?