Ошибка при использовании предварительно заполненной базы данных с GreenDao - «таблица уже существует» - PullRequest
0 голосов
/ 21 февраля 2019

Я знаю, что этот вопрос задавался много раз прежде, но я не мог понять его.

Я копирую свою базу данных из папки ресурсов при первом запуске, используя метод, объясненный здесь .но когда я запускаю приложение, оно вылетает со следующей ошибкой:

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

    }
}
...