данных в моих приложениях всегда были небольшими, поэтому я использовал общие предпочтения, но для моего нового приложения я решил, что мне нужно использовать 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);
}
Я знаю, что все еще нужны некоторые работы, особенно в том, как я всегда отправляю и возвращаю строки :), но вот мои основные вопросы:
Я направляюсь в правильном направлении? я чувствую, что в том, как я это делаю, может быть что-то принципиально неправильное.
я всегда открыт (); перед выполнением какого-либо отдельного действия и close (); после того, как это сделано, учитывая, что во многих случаях я вызываю базу данных много раз за короткий промежуток времени (например, более 10 раз менее чем за секунду), это правильно?
для тестирования приложения и чтения базы данных (android studio) мне нужно открыть проводник устройств и перейти к -> data> data> app_pkg_name> database> MDB.db, затем сохранить и затем найти нужный мне путь чтобы сохранить его на моем компьютере, то после сохранения мне нужно найти и просмотреть в «Браузере БД для SQLite», что очень много времени / раздражает :) Есть ли лучший вариант? как-то синхронизировать эти 2 приложения вместе, чтобы я мог что-то обновить и посмотреть изменения?
приветствуется любой другой совет
Большое спасибо, извините, если это немного долго, я сделал все возможное, чтобы сделать его коротким; D