Это правильный подход для использования и тестирования SQLite в Android? - PullRequest
0 голосов
/ 24 января 2019

данных в моих приложениях всегда были небольшими, поэтому я использовал общие предпочтения, но для моего нового приложения я решил, что мне нужно использовать SQLite, и я немного растерялся, я прочитал несколько статей из stackoverflow и developer.android, но я все еще не уверен, правильно ли я делаю, вот резюме моих занятий

Пример моих классов таблиц БД:

public final class UserTable implements BaseColumns {


  public static final String TABLE_NAME = "users";
  public static final String COLUMN_NAME_EMAIL = "email";
  public static final String COLUMN_NAME_SERVER_TOKEN = "token";


  public static final String SQL_CREATE_TABLE =
        "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
                _ID + " INTEGER PRIMARY KEY," +
                COLUMN_NAME_EMAIL + " TEXT," +
                COLUMN_NAME_SERVER_TOKEN + " TEXT DEFAULT 'pub'," +
                "UNIQUE(" + COLUMN_NAME_EMAIL + ")" +
                ");";
}

DBHelper:

public class DBHelper extends SQLiteOpenHelper {

private SQLiteDatabase myDB;

public static final int DATABASE_VERSION = 2;
public static final String DATABASE_NAME = "MDB.db";

public static final String NO_MATCH = "NO_MATCH_WAS_FOUND";

public DBHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    context.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
    create();
}

public void create() {
    myDB = getWritableDatabase();
    myDB.execSQL(DB.UserTable.SQL_CREATE_TABLE);
    myDB.execSQL(DB.AccountTable.SQL_CREATE_TABLE);
    close();
    Log.d("mdatabase", "create");
}

public void onCreate(SQLiteDatabase db) {
    db.execSQL(DB.UserTable.SQL_CREATE_TABLE);
    db.execSQL(DB.AccountTable.SQL_CREATE_TABLE);
    Log.d("mdatabase", "on create");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // This database is only a cache for online data, so its upgrade policy is
    // to simply to discard the data and start over
    //db.execSQL(SQL_DELETE_ENTRIES);
    //onCreate(db);
}

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    onUpgrade(db, oldVersion, newVersion);
}


public long insert(String tableName, ContentValues values) {
    Log.d("mdatabase", "insert " + tableName + ":" + values.toString());
    open();
    long res = myDB.insert(tableName, null, values);
    close();
    return res;
}

public int delete(String tableName, String whereClause) {
    open();
    int res = myDB.delete(tableName, whereClause, null);
    close();
    return res;
}

public int update(String tableName, ContentValues values, String whereClause) {
    Log.d("mdatabase", "update " + tableName + ":" + values.toString());
    open();
    int res = myDB.update(tableName, values, whereClause, null);
    close();
    return res;
}


public String select(String tableName, String select, String whereClause) {
    Log.d("mdatabase", "select " + tableName + ":" + select);
    open();
    Cursor c = myDB.rawQuery("SELECT " + select + " FROM " + tableName + " WHERE " + whereClause, null);
    Log.d("mdatabase", "select= " + select);
    if (c.moveToFirst()) {
        Log.d("mdatabase", "there is a returned row");
        return c.getString(c.getColumnIndexOrThrow(select));//String only?
    }
    c.close();
    close();
    return NO_MATCH;
}

public Map<String, String> selects(String tableName, String[] selects, String whereClause) {
    Log.d("mdatabase", "selects " + tableName + ":" + selects.toString());
    open();
    Cursor c = myDB.rawQuery("SELECT * FROM " + tableName + " WHERE " + whereClause, null);
    c.moveToNext();
    // Neeeeds Do while!
    Map<String, String> map = new HashMap<String, String>();
    for (String column : selects) {
        map.put(column, c.getString(c.getColumnIndex(column)));
    }
    c.close();
    close();
    return map;
}

public void open() {
    myDB = getWritableDatabase();
}

public void close() {
    myDB.close();
}

}

Как я использую это:

  public long setToken(String token) {
    return mDB.update(DB.UserTable.TABLE_NAME,
      new CVBuilder().add(DB.UserTable.COLUMN_NAME_SERVER_TOKEN, token).get(),
      DB.UserTable.COLUMN_NAME_EMAIL + "=" + email);
  }

  public String getToken() {
    return mDB.select(DB.UserTable.TABLE_NAME,
      DB.UserTable.COLUMN_NAME_SERVER_TOKEN,
      DB.UserTable.COLUMN_NAME_EMAIL + "=" + email);
  }

Я знаю, что все еще нужны некоторые работы, особенно в том, как я всегда отправляю и возвращаю строки :), но вот мои основные вопросы:

  1. Я направляюсь в правильном направлении? я чувствую, что в том, как я это делаю, может быть что-то принципиально неправильное.

  2. я всегда открыт (); перед выполнением какого-либо отдельного действия и close (); после того, как это сделано, учитывая, что во многих случаях я вызываю базу данных много раз за короткий промежуток времени (например, более 10 раз менее чем за секунду), это правильно?

  3. для тестирования приложения и чтения базы данных (android studio) мне нужно открыть проводник устройств и перейти к -> data> data> app_pkg_name> database> MDB.db, затем сохранить и затем найти нужный мне путь чтобы сохранить его на моем компьютере, то после сохранения мне нужно найти и просмотреть в «Браузере БД для SQLite», что очень много времени / раздражает :) Есть ли лучший вариант? как-то синхронизировать эти 2 приложения вместе, чтобы я мог что-то обновить и посмотреть изменения?

  4. приветствуется любой другой совет

Большое спасибо, извините, если это немного долго, я сделал все возможное, чтобы сделать его коротким; D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...