2016-03-09 7 views
3

У меня есть файл базы данных в активов папок, когда пользователь установить эту программу в первый раз лаунчер я скопировать базу данных из активов в базы данных программыКак использовать базу данных имеющихся в активе с ORMLite

Это мой код:

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(); 
} 

проверить базы данных папки в устройстве, и увидеть, что он имеет 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 
); 
+0

Правильно ли вы установили исходный файл db? См. Http://stackoverflow.com/a/5799920/420594 относительно android_metadata – drhr

+0

@drhr, pls видят мою конфигурацию в файле модели и когда я делаю базу данных командой sql? –

+0

У меня есть информация об успешной работе команды, когда я помещал data.db в папку с базами данных вручную –

ответ

0

Когда

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

называется data.db было создать. так что onCreate не будет звонить. Вы не должны ставить здесь createDataBase.

Я думаю, что вы можете поместить его в getWritableDatabase или getDao функции.

+0

Спасибо, я поставил эту функцию, чтобы получить * Дао функция и программа работали –