我正在將我的舊資料庫升級為房間資料庫,同時從普通的sql陳述句轉換為房間sql陳述句。 我正面臨著來自以下場景的問題。
情景一。 我在變數中存盤了這樣的子查詢
String subQueryLocalAddress = "SELECT * FROM localAddressTable where activeAddressId = 1" 。
String subQueryPermanentAddress = "SELECT * FROM permanentAddressTable where activeAddressId = 1";
現在,這將是有條件的,就像這樣。
public CursorloadAllUserAdress(boolean isLocal){
String userAddressQuery = "SELECT * FROM userTable Where"
isLocal? subQueryLocalAddress : subQueryPermanentAddress;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(userAddressQuery,null)。
return cursor;
情景二。 我有一個帶有一堆常量的過濾器
Constant.ORDER_BY_FIRST_NAME_DESC = "ORDER BY firstName DESC"。
Constant.ORDER_BY_LAST_NAME_DESC = "ORDER BY lastName DESC"。
現在,這個標志在UI級別設定,它將在資料庫類中檢查,根據各自的標志 我的查詢將回傳尊重的資料。
public Cursor loadAllUserDetails(){
String userDetailsQuery = "SELECT * FROM userTable Where " Constant.ORDER_BY_LAST_NAME_DESC;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(userDetailsQuery,null)。
return cursor;
我想在單個變數中結合或合并兩個或多個子查詢,然后啟動它。我有動態查詢。
uj5u.com熱心網友回復:
簡而言之,使用@Rawquery注解進行動態查詢。
演示
這里有一個Room前后的演示,它使用了一個簡單的表TableX,其中有id(長/INTEGER PRIMARY KEY)、firstname(字串/文本)和lastName(字串/文本)。
演示插入了一些資料,然后通過動態生成的SQL來提取它的排序(場景二)。
在房間里TableX被嵌入到DBHelper中,名字有常量,也有所有的ORDER BY permutations,也有一些方法,所以DBHelper :-
class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
Private static volatile DBHelper instance = null;
SQLiteDatabase db;
private DBHelper(Context context) {
super(context,DBNAME,null, DBVERSION)。
db = this.getWritableDatabase()。
}
public static DBHelper getInstance(Context context) {
如果(instance == null) {
instance = new DBHelper(context);
}
return instance。
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TableX.createSQL)。
db.execSQL(TableX.createFirstNameIndex)。
db.execSQL(TableX.createLastNameIndex)。
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
}
public long insert(String firstName, String lastName) {
ContentValues cv = new ContentValues()。
cv.put(TableX.COLUMN_FIRSTNAME,firstName)。
cv.put(TableX.COLUMN_LASTNAME,lastName)。
return db.insert(TableX.NAME,null,cv) 。
}
public Cursor loadAllDetails(int orderBy) {
StringBuilder sb = new StringBuilder("SELECT * FROM " ).append(NAME)。
switch (orderBy) {
case TableX.FIRSTNAME_DESCENDING:
sb.append(TableX.ORDER_BY_FIRSTNAME_DESC)。
休息。
case TableX.FIRSTNAME_ASCENDING:
sb.append(TableX.ORDER_BY_FIRSTNAME_ASC)。
休息。
case TableX.LASTNAME_DESCENDING:
sb.append(TableX.ORDER_BY_LASTNAME_DESC)。
休息。
case TableX.LASTNAME_ASCENDING:
sb.append(TableX.ORDER_BY_LASTNAME_ASC)。
休息。
default:
break;
}
sb.append(";")。
return db.rawQuery(sb.toString(),null) 。
}
類TableX {
public static final String NAME = "tablex" 。
public static final String COLUMN_ID = BaseColumns._ID;
public static final String COLUMN_FIRSTNAME = "firstName" 。
public static final String COLUMN_LASTNAME = "lastName" 。
public static final String ORDER_BY_FIRSTNAME = " ORDER BY " COLUMN_FIRSTNAME;
public static final String ORDER_BY_LASTNAME = " ORDER BY " COLUMN_LASTNAME;
public static final String ORDER_BY_FIRSTNAME_DESC = ORDER_BY_FIRSTNAME " DESC" 。
public static final String ORDER_BY_FIRSTNAME_ASC = ORDER_BY_FIRSTNAME " ASC ";
public static final String ORDER_BY_LASTNAME_DESC = ORDER_BY_LASTNAME " DESC";
public static final String ORDER_BY_LASTNAME_ASC = ORDER_BY_LASTNAME " ASC";
public static final int FIRSTNAME_DESCENDING = 0;
public static final int FIRSTNAME_ASCENDING = 1;
public static final int LASTNAME_DESCENDING = 2;
public static final int LASTNAME_ASCENDING = 3;
private static final String createSQL = 3;. 運算子">= "CREATE TABLE IF NOT EXISTS " NAME "(" )
COLUMN_ID " INTEGER PRIMARY KEY "
" ," COLUMN_FIRSTNAME " TEXT"
" ," COLUMN_LASTNAME " TEXT"
" )"。)
private static final String createFirstNameIndex = " CREATE INDEX IF NOT EXISTS IDX_" NAME COLUMN_FIRSTNAME
" ON " NAME "("
COLUMN_FIRSTNAME
")"。)
private static final String createLastNameIndex = = "CREATE INDEX IF NOT EXISTS IDX" NAME COLUMN_LASTNAME
" ON " NAME "("
COLUMN_LASTNAME
")"。)
public Cursor getSomeData(String query) {
return db.rawQuery(query,null) 。
}
}
房間等同于
首先是@Entity類TableXEntity :-
@Entity(tableName = DBHelper.TableX.NAME,
indices = {
@Index(value = DBHelper.TableX.COLUMN_FIRSTNAME) 。
@Index(value = DBHelper.TableX.COLUMN_LASTNAME)
}
)
class TableXEntity {
@PrimaryKey @ColumnInfo(name =DBHelper.TableX.COLUMN_ID)
長的id。
@ColumnInfo(name = DBHelper.TableX.COLUMN_FIRSTNAME)
字串firstName。
@ColumnInfo(name = DBHelper.TableX.COLUMN_LASTNAME)
字串lastName。
public TableXEntity(){}。
@Ignore
public TableXEntity(String firstName, String lastName) {
this.firstName = firstName。
this.lastName = lastName;
}
- 冒昧地使用了pre-room的常數 。
- 除了@Ignored第二建構式外,這里沒有任何特別之處 。
@Dao類TableXDao :-
@Dao
抽象類TableXDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
抽象的長insert(TableXEntity tableXEntity)。
@Query("SELECT * FROM " DBHelper.TableX.NAME DBHelper.TableX.ORDER_BY_FIRSTNAME_ASC)
抽象的List<TableXEntity>getAllByFirstNameAscending()。
//等
/* 不能使用下面的@Query,并且注釋了,因為編譯錯誤
錯誤:不相干的輸入':order'預計會出現
{<EOF>, '; ', K_ALTER, K_ANALYZE, K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH,
K_drop, K_end, K_explain, K_insert, K_pragma, K_reindex, K_release, K_replace, K_rollback, K_savepoint,
k_select, k_update, k_vacuum, k_values, k_with, unexpected_char}。
抽象的List<TableXEntity> getAllByPassedOrder(String order)。
另外,它用''包裹了傳遞的引數,所以被當作字面意思而不是ORDER BY子句。
*/
//@SkipQueryVerification
//@Query("SELECT * FROM " DBHelper.TableX.NAME " :order" )
//抽象List<TableXEntity>getAllByPassedOrder(String order) 。
/* SO */
@RawQuery
抽象的List<TableXEntity>rawq(SupportSQLiteQuery qry)。
}
- 注意,假設它是Room,所以沒有Cursors,而是物件的Arrays。
@資料庫類 TheDatabase (注意不同的資料庫名稱,以便在演示中兩者可以共存):-
@Database(entities = {TableXEntity.class},version= 1)
抽象類 TheDatabase extends RoomDatabase {
抽象的TableXDao getTableXDao()。
private static volatile TheDatabase instance = null;
public static TheDatabase getInstance(Context context) {
如果(instance == null) {
實體 = Room.databaseBuilder(
context, TheDatabase.class, "myroomdb"
)
.allowMainThreadQueries()
.build()。
}
return實體。
}
}
將兩者付諸行動的是MainActivity :-
public class MainActivity extends AppCompatActivity {
DBHelper dbHelper。
TheDatabase roomDB;
TableXDao roomDao。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)。
setContentView(R.layout.activity_main)。
dbHelper = DBHelper.getInstance(this);
dbHelper.insert("Mary", "Bloggs")。
dbHelper.insert("Francis", "Frank");
dbHelper.insert("Jane", "Doe")。
logIt(dbHelper.loadAllDetails(DBHelper.TableX.LASTNAME_ASCENDING))。
logIt(dbHelper.loadAllDetails(DBHelper.TableX.FIRSTNAME_ASCENDING))。
logIt(dbHelper.loadAllDetails(DBHelper.TableX.LASTNAME_DESCENDING))。
/* 房間 */
roomDB = TheDatabase.getInstance(this);
roomDao = roomDB.getTableXDao()。
roomDao.insert(new TableXEntity("Mary", "Bloggs"))。
roomDao.insert(new TableXEntity("Francis", "Frank"))。
roomDao.insert(new TableXEntity("Jane", "Doe"))。
roomLogit(roomDao.getAllByFirstNameAscending())。
roomLogit(getListByPassedOrder(DBHelper.TableX.FIRSTNAME_DESCENDING))。
roomLogit(getListByPassedOrder(DBHelper.TableX.FIRSTNAME_ASCENDING))。
roomLogit(getListByPassedOrder(DBHelper.TableX.LASTNAME_DESCENDING))。
roomLogit(getListByPassedOrder(DBHelper.TableX.LASTNAME_ASCENDING))。
}
void logIt(Cursor c) {
DatabaseUtils.dumpCursor(c)。
}
void roomLogit(List<TableXEntity>thelist) {
for (TableXEntity t: thelist) {
Log.d("ROOMINFO", "ID是" t.id " FirstName是" t. firstName " LastName is " t.lastName)。)
}
}
private List<TableXEntity>getListByPassedOrder(int order) {
StringBuilder sb = new StringBuilder("SELECT * FROM " ).append(DBHelper.TableX.NAME)。
switch (order) {
case DBHelper.TableX.FIRSTNAME_DESCENDING:
sb.append(DBHelper.TableX.ORDER_BY_FIRSTNAME_DESC)。
休息。
case DBHelper.TableX.FIRSTNAME_ASCENDING:
sb.append(DBHelper.TableX.ORDER_BY_FIRSTNAME_ASC)。
休息。
case DBHelper.TableX.LASTNAME_DESCENDING:
sb.append(DBHelper.TableX.ORDER_BY_LASTNAME_DESC)。
休息。
case DBHelper.TableX.LASTNAME_ASCENDING:
sb.append(DBHelper.TableX.ORDER_BY_LASTNAME_ASC)。
休息。
default:
break;
}
sb.append(";")。
return roomDao.rawq(new SimpleSQLiteQuery(sb.toString(),null))。)
}
}
首先,預室資料庫被填充,并使用各種動態生成的排序提取資料,游標被轉儲到日志。
然后,房間資料庫基本上模仿上述情況,但顯然是使用房間,雖然資料輸出到日志是通過提取的物件(TableXEntity)完成的。
日志中的結果 :-
20210922 13: 08: 19. 393 I/System.out: >>>> Dumping cursor android. 資料庫.sqlite.SQLiteCursor@b9ccda0。
2021-09-22 13:08:19. 394 I/System.out: 0 {
2021-09-22 13:08:19. 394 I/System.out: _id=1。
2021-09-22 13:08:19. 394 I/System.out: firstName=Mary
2021-09-22 13:08:19. 394 I/System.out: lastName=Bloggs
2021-09-22 13:08:19。 394 I/System.out: }
2021-09-22 13:08:19. 394 I/System.out: 1 {
2021-09-22 13:08:19. 394 I/System.out: _id=3
2021-09-22 13:08:19. 394 I/System.out: firstName=Jane
2021-09-22 13:08:19. 394 I/System.out: lastName=Doe
2021-09-22 13:08:19。 395 I/System.out: }
2021-09-22 13:08:19。 395 I/System.out: 2 {
2021-09-22 13:08:19. 395 I/System.out: _id=2
2021-09-22 13:08:19. 395 I/System.out: firstName=Francis
2021-09-22 13:08:19。 395 I/System.out: lastName=Frank
2021-09-22 13:08:19。 395 I/System.out: }
2021-09-22 13:08:19。 395 I/System.out: <<<<<
2021-09-22 13:08:19. 396 I/System.out: >>>> Dumping cursor android. 資料庫.sqlite.SQLiteCursor@22a7d59。
2021-09-22 13:08:19。 396 I/System.out: 0 {
2021-09-22 13:08:19. 396 I/System.out: _id=2
2021-09-22 13:08:19。 396 I/System.out: firstName=Francis
2021-09-22 13:08:19. 397 I/System.out: lastName=Frank
2021-09-22 13:08:19. 397 I/System.out: }
2021-09-22 13:08:19。 397 I/System.out: 1 {
2021-09-22 13:08:19。 397 I/System.out: _id=3
2021-09-22 13:08:19。 397 I/System.out: firstName=Jane
2021-09-22 13:08:19. 397 I/System.out: lastName=Doe
2021-09-22 13:08:19。 398 I/System.out: }
2021-09-22 13:08:19。 398 I/System.out: 2 {
2021-09-22 13:08:19。 398 I/System.out: _id=1
2021-09-22 13:08:19. 398 I/System.out: firstName=Mary
2021-09-22 13:08:19。 398 I/System.out: lastName=Bloggs
2021-09-22 13:08:19。 398 I/System.out: }
2021-09-22 13:08:19。 398 I/System.out: <<<<<
2021-09-22 13:08:19. 398 I/System.out: >>>> Dumping cursor android. 資料庫.sqlite.SQLiteCursor@a1ead1e。
2021-09-22 13:08:19. 399 I/System.out: 0 {
2021-09-22 13:08:19. 399 I/System.out: _id=2
2021-09-22 13:08:19. 399 I/System.out: firstName=Francis
2021-09-22 13:08:19. 399 I/System.out: lastName=Frank
2021-09-22 13:08:19。 399 I/System.out: }
2021-09-22 13:08:19。 399 I/System.out: 1 {
2021-09-22 13:08:19. 399 I/System.out: _id=3
2021-09-22 13:08:19。 399 I/System.out: firstName=Jane
2021-09-22 13:08:19。 400 I/System.out: lastName=Doe
2021-09-22 13:08:19。 400 I/System.out: }
2021-09-22 13:08:19。 400 I/System.out: 2 {
2021-09-22 13:08:19。 400 I/System.out: _id=1。
2021-09-22 13:08:19。 400 I/System.out: firstName=Mary
2021-09-22 13:08:19. 400 I/System.out: lastName=Bloggs
2021-09-22 13:08:19。 400 I/System.out: }
2021-09-22 13:08:19。 400 I/System.out: <<<<<
2021-09-22 13:08:19. 456 D/ROOMINFO: ID 是 2 名 是 Francis 姓 是 Frank
2021-09-22 13:08:19。 456 D/ROOMINFO: ID 是 3 FirstName 是 Jane LastName 是 Doe
2021-09-22 13:08:19。 456 D/ROOMINFO: ID 是 1 名 是 Mary 姓 是 Bloggs
2021-09-22 13:08:19。 458 D/ROOMINFO: ID 是 1 名 是 瑪麗 LastName 是 Bloggs
2021-09-22 13:08:19。 458 D/ROOMINFO: ID 是 3 FirstName 是 Jane LastName 是 Doe
2021-09-22 13:08:19. 458 D/ROOMINFO: ID 是 2 名 是 Francis 姓 是 Frank
2021-09-22 13:08:19. 460 D/ROOMINFO: ID 是 2 名 是 Francis 姓 是 Frank
2021-09-22 13:08:19. 460 D/ROOMINFO: ID 是 3 名 是 Jane 姓 是 Doe
2021-09-22 13:08:19。 460 D/ROOMINFO: ID 是 1 名 是 瑪麗 LastName 是 Bloggs
2021-09-22 13:08:19. 462 D/ROOMINFO: ID 是 2 名 是 Francis 姓 是 Frank
2021-09-22 13:08:19。 462 D/ROOMINFO: ID 是 3 FirstName 是 Jane LastName 是 Doe
2021-09-22 13:08:19。 462 D/ROOMINFO: ID 是 1 名 是 瑪麗 LastName 是 Bloggs
2021-09-22 13:08:19. 463 D/ROOMINFO: ID 是 1 名 是 瑪麗 LastName 是 Bloggs
2021-09-22 13:08:19。 463 D/ROOMINFO: ID 是 3 FirstName 是 Jane LastName 是 Doe
2021-09-22 13:08:19。 463 D/ROOMINFO: ID 是 2 FirstName 是 Francis LastName 是 Frank
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332643.html
標籤:
上一篇:如何找到一個網站的正確API?
