Обновление Android-приложения базы данных SQLite

У меня есть приложение Android Quote, в котором я использовал базу данных SQLite для хранения котировок. Я запустил первую версию приложения с этим DatabaseHelper.

public class DataBaseHandler extends SQLiteOpenHelper {
        private static String DB_PATH;
        private static String DB_NAME = "SuccessQuotes";
        private SQLiteDatabase myDataBase;
        private static int DATABASE_VERSION = 1;
        private final Context myContext;

        public DataBaseHandler(Context context) {

            super(context, DB_NAME, null, 1);
            this.myContext = context;
            DB_PATH = context.getDatabasePath(DB_NAME).toString();
            Log.e("path", DB_PATH);
        }

        // ==============================================================================


        public void createDataBase() throws IOException {

            boolean dbExist = checkDataBase();

            if (dbExist) {
                // do nothing - database already exist
            } else {

                this.getReadableDatabase();

                try {

                    copyDataBase();

                } catch (IOException e) {

                    throw new Error("Error copying database");

                }
            }

        }

        // ==============================================================================

        private boolean checkDataBase() {

            SQLiteDatabase checkDB = null;

            try {
                String myPath = DB_PATH;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

            } catch (SQLiteException e) {

                // database does't exist yet.

            }

            if (checkDB != null) {

                checkDB.close();

            }

            return checkDB != null ? true : false;
        }

        // ==============================================================================

        private void copyDataBase() throws IOException {

            // Open your local db as the input stream
            InputStream myInput = myContext.getAssets().open(DB_NAME);

            // Path to the just created empty db
            String outFileName = DB_PATH;

            // Open the empty db as the output stream
            OutputStream myOutput = new FileOutputStream(outFileName);

            // transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }

            // Close the streams
            myOutput.flush();
            myOutput.close();
            myInput.close();

        }

        // ==============================================================================

        public void openDataBase() throws SQLException {

            // Open the database
            String myPath = DB_PATH;
            myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }

        // ==============================================================================

        @Override
        public synchronized void close() {

            if (myDataBase != null)
                myDataBase.close();

            super.close();

        }

        // ==============================================================================

        @Override
        public void onCreate(SQLiteDatabase db) {

        }

        // ==============================================================================

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }
    }

и моя активность базы данных:

public class DAO {

    // All Static variables

    private SQLiteDatabase database;
    private DataBaseHandler dbHandler;

    private static final String TABLE_QUOTES = "quotes";
    private static final String TABLE_AUTHORS = "authors";
    private static final String TABLE_SETTINGS = "settings";

    // Pages Table Columns names

    private static final String QU_ID = "_quid";
    private static final String QU_TEXT = "qu_text";
    private static final String QU_AUTHOR = "qu_author";
    private static final String QU_FAVORITE = "qu_favorite";
    private static final String QU_WEB_ID = "qu_web_id";

    private static final String AU_ID = "_auid";
    private static final String AU_NAME = "au_name";
    private static final String AU_PICTURE = "au_picture";
    private static final String AU_PICTURE_SDCARD = "au_picture_sdcard";
    private static final String AU_WEB_ID = "au_web_id";

    // ==============================================================================

    public DAO(Context context) {
        dbHandler = new DataBaseHandler(context);
        try {

            dbHandler.createDataBase();

        } catch (IOException ioe) {

            throw new Error("Unable to create database");

        }
        try {

            dbHandler.openDataBase();

        } catch (SQLException sqle) {

            throw sqle;

        }
//      Log.e("path2", context.getDatabasePath("SuccessQuotes").toString());
        // open();
    }


    // ==============================================================================

    // Getting All Quotes
    public Cursor getQuotes(String start) {
        // Select All Query

        String limit = "15";

        if (start.equals("5000")) {
            String query_count = "SELECT COUNT(" + QU_ID + ") AS count FROM "
                    + TABLE_QUOTES;
            Cursor c_count = database.rawQuery(query_count, null);
            c_count.moveToFirst();
            Integer count = c_count.getInt(c_count.getColumnIndex("count"));
            limit = String.valueOf(count);
        }
        String query = "SELECT * FROM " + TABLE_QUOTES + " JOIN "
                + TABLE_AUTHORS + " ON " + QU_AUTHOR + " = " + AU_WEB_ID
                + " ORDER BY " + QU_WEB_ID + " DESC "+ " LIMIT " + start + ", " + limit;
        //Log.i("query",query);
        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor;

    }

    // ==============================================================================

    // Getting All Quotes
    public Cursor getFavoriteQuotes(String start) {
        // Select All Query
        String limit = "15";

        String query = "SELECT * FROM " + TABLE_QUOTES + " JOIN "
                + TABLE_AUTHORS + " ON " + QU_AUTHOR + " = " + AU_WEB_ID
                + " WHERE " + QU_FAVORITE + " = " + "1"+" ORDER BY " + QU_WEB_ID + " DESC  "+ " LIMIT " + start + ", " + limit;
        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor;

    }

    //======================================================================

    // Getting Fav Quote from ID
        public String getFavQuotes(String strkey_id) {
            // Select All Query
            String fav = "";
            String query = "SELECT * FROM " + TABLE_QUOTES + " JOIN "
                    + TABLE_AUTHORS + " ON " + QU_AUTHOR + " = " + AU_WEB_ID
                    + " WHERE " + QU_FAVORITE + " = " + "1 AND " + QU_ID + " = " +strkey_id;
            Cursor cursor = database.rawQuery(query, null);

            if(cursor.getCount() != 0)
            {
                cursor.moveToFirst();
                fav = cursor.getString(cursor.getColumnIndex(QU_FAVORITE));

            }
            return fav;

        }

    // ==============================================================================

    // Getting All Author Quotes
    public Cursor getAuthorQuotes(String authorID,String start) { 
        // Select All Query
        String limit="15";
        String query = "SELECT * FROM " + TABLE_QUOTES + " JOIN "
                + TABLE_AUTHORS + " ON " + QU_AUTHOR + " = " + AU_WEB_ID
                + " WHERE " + QU_AUTHOR + " = " + authorID + " ORDER BY "+ QU_WEB_ID +" DESC  "+ " LIMIT " + start + ", " + limit;
        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor;

    }

    // ==============================================================================

    // Getting Selected Quote
    public Cursor getOneQuote(String quoteID) {
        // Select All Query

        String query = "SELECT * FROM " + TABLE_QUOTES + " JOIN "
                + TABLE_AUTHORS + " ON " + QU_AUTHOR + " = " + AU_WEB_ID
                + " WHERE " + QU_ID + " = '" + quoteID + "'";
        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor;

    }

    // ==============================================================================

    public void addOrRemoveFavorites(String id, String value) {



        ContentValues values = new ContentValues();
        values.put(QU_FAVORITE, value);

        // Update Row
//      database.update(TABLE_QUOTES, values, QU_ID + "=?", new String[] { id });
        database.update(TABLE_QUOTES, values, QU_ID + "=?", new String[] { id });
    }

    // ==============================================================================

    // Getting All Authors
    public Cursor getAllAuthors() {
        // Select All Query

        String query = "SELECT *, COUNT(" + QU_AUTHOR + ") AS count FROM "
                + TABLE_AUTHORS + " LEFT JOIN " + TABLE_QUOTES + " ON " + AU_WEB_ID
                + " = " + QU_AUTHOR + " GROUP BY  " + AU_NAME ;
        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor;

    }

    // ==============================================================================

    // Getting Quotes Count
    public Integer getQuotesCount() {

        String query = "SELECT COUNT(" + QU_TEXT + ") AS count FROM "
                + TABLE_QUOTES;
        Cursor cursor = database.rawQuery(query, null);
        cursor.moveToFirst();
        Integer count = cursor.getInt(cursor.getColumnIndex("count"));

        return count;

    }

    // ==============================================================================

    // Getting Quote ID
    public Integer getQotdId() {

        String query = "SELECT " + QU_ID + " FROM " + TABLE_QUOTES
                + " ORDER BY RANDOM() LIMIT 1";
        Cursor cursor = database.rawQuery(query, null);
        cursor.moveToFirst();
        Integer id = cursor.getInt(cursor.getColumnIndex(QU_ID));

        return id;

    }

    // ==============================================================================

    public void updateSetting(String field, String value) {
        open();
        ContentValues values = new ContentValues();
        values.put(field, value);

        // Update Row
        database.update(TABLE_SETTINGS, values, null, null);
    }

    // ==============================================================================

    public Cursor getSettings() {
        open();
        String query = "SELECT * FROM " + TABLE_SETTINGS;
        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor;
    }

    // ==============================================================================

    public int getLastAuthor() {

        String query = "SELECT " + AU_WEB_ID + " FROM " + TABLE_AUTHORS
                + " ORDER BY " + AU_WEB_ID + " DESC LIMIT 1";

        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor.getInt(cursor.getColumnIndex(AU_WEB_ID));

    }

    // ==============================================================================

    public int getLastQuote() {
        String query = "SELECT " + QU_WEB_ID + " FROM " + TABLE_QUOTES
                + " ORDER BY " + QU_WEB_ID + " DESC LIMIT 1";

        Cursor cursor = database.rawQuery(query, null);

        cursor.moveToFirst();
        return cursor.getInt(cursor.getColumnIndex(QU_WEB_ID));

    }

    // ==============================================================================

    public void addAuthor(String au_name, String au_picture, int au_web_id) {
        open();     

        ContentValues v = new ContentValues();
        v.put(AU_NAME, au_name);
        v.put(AU_PICTURE, au_picture);
        v.put(AU_PICTURE_SDCARD, 1);        
        v.put(AU_WEB_ID, au_web_id);

        database.insert(TABLE_AUTHORS, null, v);

    }

    // ==============================================================================

    public void addQuote(String qu_text, int qu_author, int qu_web_id) {
        open();
        ContentValues v = new ContentValues();
        v.put(QU_TEXT, qu_text);        
        v.put(QU_AUTHOR, qu_author);
        v.put(QU_FAVORITE, "0");        
        v.put(QU_WEB_ID, qu_web_id);

        database.insert(TABLE_QUOTES, null, v);

    }

    // ==============================================================================

    public void open() throws SQLException {
//      database = dbHandler.getReadableDatabase();
        database = dbHandler.getWritableDatabase();

    }

    // ==============================================================================

    public void closeDatabase() {
        dbHandler.close();
    }

Теперь, если я хочу обновить приложение с большим количеством кавычек, какие изменения я должен внести, чтобы новые и старые пользователи не сталкивались с какими-либо проблемами?

Я не опытный разработчик Android, поэтому, пожалуйста, объясните мне немного больше, если это возможно, я буду очень благодарен за это. Спасибо

Спасибо


person Rajubhai Rathod    schedule 24.02.2016    source источник
comment
Обновите свое приложение VersionCode и DBVersion при обновлении вашего приложения, тогда onUpgrade(...) должен вызвать добавление новой логики Tables и Columns здесь   -  person M D    schedule 24.02.2016
comment
Собираетесь ли вы вносить какие-либо изменения в схему базы данных? или вы просто добавляете больше строк в свою таблицу?   -  person Bhargav    schedule 24.02.2016
comment
Я просто добавляю больше строк... никаких изменений в структуре базы данных. Спасибо   -  person Rajubhai Rathod    schedule 24.02.2016
comment
@M D Не могли бы вы объяснить немного больше, потому что я учусь, а не эксперт в Android или Java. Спасибо   -  person Rajubhai Rathod    schedule 24.02.2016


Ответы (2)


Попробуйте это, просто добавьте цитату в базу данных, как здесь, я добавляю контакт так же, как вы можете добавить цитату в базу данных.

//Add new Contact by calling this method
  public void addContact(Contact contact)
        {
// getting db instance for writing the contact
 SQLiteDatabase db=this.getWritableDatabase();
 ContentValues cv=new ContentValues();
 cv.put(Contact_fname,contact.getFname());
 cv.put(Contact_lname,contact.getLname());
 cv.put(Contact_number,contact.getContactnumber());
 //inserting row
 db.insert(Table_Name, null, cv);
//close the database to avoid any leak
 db.close();
 }

См. здесь https://androidruler.wordpress.com/2016/02/22/android-working-with-sqlite-database/

person Jagjit Singh    schedule 24.02.2016
comment
@Rajubhai Rathod не нужно вызывать onupgrade, так как вы не меняете свой стол - person Jagjit Singh; 24.02.2016

просто увеличьте database version и onUpgrade() будет звонить автоматически

private static int DATABASE_VERSION = 2;

и добавьте поле таблицы базы данных внутри этой функции

@Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }
person Muhammad Nasir Rajput    schedule 24.02.2016
comment
Спасибо за это ........ Я не понимаю, просто добавьте поле таблицы базы данных в эту функцию. Можете ли вы сказать, что и как мне нужно добавить? - person Rajubhai Rathod; 24.02.2016