Я знаю, что этот вопрос задавался много раз прежде, но я не мог понять его.
Я копирую свою базу данных из папки ресурсов при первом запуске, используя метод, объясненный здесь .но когда я запускаю приложение, оно вылетает со следующей ошибкой:
android.database.sqlite.SQLiteException: table "TOOL" already exists (code 1): , while compiling: CREATE TABLE "TOOL" ("_id" INTEGER PRIMARY KEY ,"NAME" TEXT NOT NULL ,"IMAGE" TEXT,"TYPE" INTEGER NOT NULL ,"LAST_USED_DATE" INTEGER NOT NULL );
Я сам создал таблицу, используя сгенерированный сценарий GreenDao SQlite, поэтому моя база данных идентична той, что пытается создать GreenDao.
Что я должен сделать, чтобы заставить GreenDao принять мою собственную базу данных?
Это мой класс DatabaseHelper на случай, если вам нужно его прочитать:
public class DatabaseHelper extends DaoMaster.OpenHelper {
private SQLiteDatabase db;
private DaoMaster daoMaster;
private Context context;
private static DatabaseHelper mInstance;
private DaoSession daoSession;
private SQLiteDatabase sqliteDatabase;
private static String DB_PATH;
private static String DB_NAME = "main-db";
public DatabaseHelper(Context context, SQLiteDatabase.CursorFactory factory) {
super(context, DB_NAME, factory);
this.context = context;
if (android.os.Build.VERSION.SDK_INT >= 17) {
DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
} else {
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
try {
createDataBase();
} catch (Exception ioe) {
throw new Error("Unable to create database");
}
}
public static DatabaseHelper getInstance(Context context) {
if (mInstance != null)
return mInstance;
mInstance = new DatabaseHelper(context.getApplicationContext(), null);
mInstance.db = mInstance.getWritableDatabase();
mInstance.daoMaster = new DaoMaster(mInstance.db);
mInstance.daoSession = mInstance.daoMaster.newSession();
return mInstance;
}
public DaoMaster getDaoMaster() {
return daoMaster;
}
public DaoSession getDaoSession() {
return daoSession;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
/**
* Open Database for Use
*/
public void openDatabase() {
String databasePath = DB_PATH + DB_NAME;
sqliteDatabase = SQLiteDatabase.openDatabase(databasePath, null,
(SQLiteDatabase.OPEN_READWRITE));
}
/**
* Close Database after use
*/
@Override
public synchronized void close() {
if ((sqliteDatabase != null) && sqliteDatabase.isOpen()) {
sqliteDatabase.close();
}
super.close();
}
/**
* Get database instance for use
*/
public SQLiteDatabase getSqliteDatabase() {
return sqliteDatabase;
}
/**
* Create new database if not present
*/
public void createDataBase() {
SQLiteDatabase sqliteDatabase = null;
if (databaseExists()) {
/* Check for Upgrade */
} else {
/* Database does not exists create blank database */
sqliteDatabase = this.getReadableDatabase();
sqliteDatabase.close();
copyDataBase();
}
}
/**
* Check Database if it exists
*/
private boolean databaseExists() {
SQLiteDatabase sqliteDatabase = null;
try {
String databasePath = DB_PATH + DB_NAME;
sqliteDatabase = SQLiteDatabase.openDatabase(databasePath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
e.printStackTrace();
}
if (sqliteDatabase != null) {
sqliteDatabase.close();
}
return sqliteDatabase != null ? true : false;
}
/**
* Copy existing database file in system
*/
public void copyDataBase() {
int length;
byte[] buffer = new byte[1024];
String databasePath = DB_PATH + DB_NAME;
try {
InputStream databaseInputFile = this.context.getAssets().open("databases/" + DB_NAME + ".sqlite");
OutputStream databaseOutputFile = new FileOutputStream(databasePath);
while ((length = databaseInputFile.read(buffer)) > 0) {
databaseOutputFile.write(buffer, 0, length);
databaseOutputFile.flush();
}
databaseInputFile.close();
databaseOutputFile.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}