Использование Sqlite в андроид

302
01 декабря 2017, 05:32

Есть большая строка, полученная после http запроса. Как мне ее сохранить в базе дынных и после когда нужно, загружать в других активити. Как реализовать? В андроид разработке новичок)

Answer 1

Реализация простейшего key-value хранилища для Android приложения используя sqlite (по аналогии SharedPreferences)

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
 * Created by Android on 30.11.2017.
 */
public class DBManager extends SQLiteOpenHelper {
    private static DBManager sInstance;
    //если изменить версию, то выполняем то, что в onUpgrade()
    private static final int DATABASE_VERSION = 1;
    private static final String
            LOG_TAG = "DBManager",
            DATABASE_NAME = "mydata.db",
            TABLE_DATA = "data",
            TABLE_DATA_ID = "id",
            TABLE_DATA_KEY = "key",
            TABLE_DATA_VALUE= "value";
    public static final String
            PRICE = "price",
            PHOTO = "photo",
            TRUE = "true",
            FALSE = "false";
    public static synchronized DBManager getInstance(Context context) {
        if (sInstance == null) sInstance = new DBManager(context);
        return sInstance;
    }
    private DBManager(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onConfigure(SQLiteDatabase db) {
        super.onConfigure(db);
        db.setForeignKeyConstraintsEnabled(true);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE_DATA = "CREATE TABLE " + TABLE_DATA +
                "(" +
                TABLE_DATA_ID + " INTEGER PRIMARY KEY," +
                TABLE_DATA_KEY + " TEXT," +
                TABLE_DATA_VALUE + " TEXT" +
                ")";
        db.execSQL(CREATE_TABLE_DATA);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion != newVersion) {
            //удалим текущую версию базы со всеми данными
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_DATA);
            //создадим новую базу
            onCreate(db);
        }
    }
    public static long set(String key, String value) {
        SQLiteDatabase db = sInstance.getWritableDatabase();
        db.beginTransaction();
        long result = -1;
        try {
            ContentValues values = new ContentValues();
            values.put(TABLE_DATA_KEY, key);
            values.put(TABLE_DATA_VALUE, value);
            int rows = db.update(TABLE_DATA, values, TABLE_DATA_KEY + "= ?", new String[]{key});
            if (rows == 1) {
                String settingSelectQuery = String.format("SELECT %s FROM %s WHERE %s = ?", TABLE_DATA_ID, TABLE_DATA, TABLE_DATA_KEY);
                Cursor cursor = db.rawQuery(settingSelectQuery, new String[]{String.valueOf(key)});
                try {
                    if (cursor.moveToFirst()) {
                        result = cursor.getInt(0);
                        db.setTransactionSuccessful();
                    }
                } finally {
                    if (cursor != null && !cursor.isClosed()) {
                        cursor.close();
                    }
                }
            } else {
                result = db.insertOrThrow(TABLE_DATA, null, values);
                db.setTransactionSuccessful();
            }
        } catch (Exception e) {
            Log.d(LOG_TAG, e.getMessage());
        } finally {
            db.endTransaction();
        }
        return result;
    }
    public static String get(String key) {
        String result = "";
        final SQLiteDatabase db = sInstance.getReadableDatabase();
        final Cursor cursor = db.rawQuery(String.format("SELECT %s FROM %s WHERE %s = ?", TABLE_DATA_VALUE, TABLE_DATA, TABLE_DATA_KEY), new String[]{String.valueOf(key)});
        try {
            if (cursor.moveToFirst()) {
                do {
                    result = cursor.getString(cursor.getColumnIndex(TABLE_DATA_VALUE));
                } while (cursor.moveToNext());
            }
        } catch (Exception e) {
            Log.e(LOG_TAG, e.getMessage());
        } finally {
            if (cursor != null && !cursor.isClosed()) {
                cursor.close();
            }
        }
        return result == null || result.equals("") || result.equals("null") ? null : result;
    }
}

Использование:

//инициализируем в каждой активности где-нибудь вначале onCreate()
DBManager.getInstance(this);
// set вставляем данные используя ключ-значение (по размерам можно вставить хоть коня хоть слона)
// ибо TEXT в sqlite понятие растяжимое
DBManager.set(DBManager.PRICE, "1234");
DBManager.set(DBManager.PHOTO, "http://site.ru/files/user_1/avatar.jpg");
// get вытаскиваем данные по ключу
Toast.makeText(this, "Price: " + DBManager.get(DBManager.PRICE) + "\nPhoto: " + DBManager.get(DBManager.PHOTO), Toast.LENGTH_LONG).show();
READ ALSO
Последствия моего варианта PreparedStatement

Последствия моего варианта PreparedStatement

В общем и целом для работы с JDBC-mysql у меня есть только три типа данных: Integer, String, Long

326
Как выбрать одно значение из Json Array

Как выбрать одно значение из Json Array

Преобразовал Json String в Java объект с помощью objectMapperТеперь из массива Json не могу получить значение для Cod или dtBeg

285
проблема preference в fragment

проблема preference в fragment

Подчеркивает FindPreference, getSharedPreferencesНеобходимо перенести из активити во фрагмент, но не получается

248
Вызов метода с помощью рефлексии

Вызов метода с помощью рефлексии

Каким способом с помощью рефлексии можно вызвать метод по его названию из определенной области классов? Или из любого класса наследника...

285