这是在Android中使用和测试SQLite的正确方法吗?

时间:2019-01-24 14:47:48

标签: android sqlite android-studio

我的应用程序中的

数据总是很小,所以我使用了共享首选项,但是对于我的新应用程序,我认为我需要使用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. 我总是open();在执行任何单个操作和close()之前;完成后,考虑到在许多情况下我在短时间内多次调用数据库(例如,在不到一秒钟的时间内超过10次)是正确的做法吗?

  3. 用于测试应用程序并读取数据库(Android Studio),我必须打开设备资源管理器并转到-> data> data> app_pkg_name> databases> MDB.db,然后单击保存,然后找到我想要的路径要将其保存到我的计算机中,然后保存后,我需要查找和浏览“ SQLite的数据库浏览器”,这非常耗时/烦人:)还有更好的选择吗?就像以某种方式将这2个应用程序同步在一起,这样我就可以刷新某些内容并查看更改?

  4. 欢迎其他任何建议

非常感谢,如果很长,我会尽力使它简短; D

0 个答案:

没有答案