Có cách nào hay không, cách lấy Cursor cho truy vấn mà tôi đang xử lý với đối tượng Dao ORMLite?Con trỏ Android với ORMLite để sử dụng trong CursorAdapter
Trả lời
ORMLite hiện hỗ trợ các phương thức next()
, previous()
, moveRelative(offset)
, ... trên CloseableIterator
class. Điều này sẽ cho phép bạn di chuyển đối tượng Cursor
bên dưới theo ý muốn.
Nó cũng hỗ trợ các phương pháp DAO Cursor sau:
dao.mapSelectStarRow(databaseResults)
Return hàng mới nhất từ các kết quả cơ sở dữ liệu từ một truy vấn đểselect *
. Với điều này, bạn có thể thay đổi vị trí con trỏ (ví dụ) và sau đó lấy đối tượng hiện tại.dao.getSelectStarRowMapper()
Cung cấp trình ánh xạ mà bạn có thể sử dụng để ánh xạ đối tượng bên ngoài Dao.
Khi bạn đang xây dựng truy vấn của riêng bạn với ORMLite, bạn sử dụng các đối tượng QueryBuilder
. queryBuilder.prepare()
trả về một PreparedQuery
được sử dụng bởi các phương pháp khác nhau trong DAO. Bạn có thể gọi dao.iterator(preparedQuery)
sẽ trả về CloseableIterator
được sử dụng để lặp qua các kết quả. Có một số iterator.getRawResults()
để truy cập vào lớp DatabaseResults
. Trong Android, điều này có thể được truyền tới một số AndroidDatabaseResults
có phương thức getCursor()
trên đó để trả về Android Cursor
.
Something như đoạn mã sau:
// build your query
QueryBuilder<Foo, String> qb = fooDao.queryBuilder();
qb.where()...;
// when you are done, prepare your query and build an iterator
CloseableIterator<Foo> iterator = dao.iterator(qb.prepare());
try {
// get the raw results which can be cast under Android
AndroidDatabaseResults results =
(AndroidDatabaseResults)iterator.getRawResults();
Cursor cursor = results.getRawCursor();
...
} finally {
iterator.closeQuietly();
}
Đây là một chút phức tạp nhưng bạn chắc chắn phải ngang phía sau thung lũng để đến đối tượng này được che giấu bởi các lớp cơ sở dữ liệu trừu tượng.
Nếu bạn ngụ ý phương pháp getHelper()
để tiếp cận các phương pháp đào tạo, v.v. bạn chỉ phải kế thừa từ số OrmLiteBaseActivity<YourDBHelper>
và bạn có thể gọi nó. Nó sẽ trông giống như thế này:
public class YourClass extends OrmLiteBaseActivity<YourDBHelper> {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
getHelper().getDao().queryForAll();
...
}
}
Nếu bạn muốn con trỏ xử lý thao tác cơ sở dữ liệu: Tôi không nghĩ rằng bạn có thể tiếp cận nó! Nhưng tôi không hiểu tại sao bạn nên cần nó. ORMLite có gần như tất cả các chức năng của con trỏ. Vì vậy, những gì bạn cần nó cho?
Tôi biết điều này, nhưng tôi cần phải sử dụng Cursor để sử dụng nó trong CursorAdapter. – sealskej
Bạn đã thử một số lời khuyên của Gray từ this bài đăng? Anh ấy giải thích cách bạn có thể chọn một cột làm tên khác, chẳng hạn như, chọn id là _id.
Vì bạn có thể đặt tên cho các cột của mình trong ormlite, tôi đoán tại sao không chỉ đặt tên cho chúng là _id, thay vì thực hiện chọn như :)? – AgentKnopf
Chắc chắn, bạn có thể, nhưng trong một trường hợp đổi tên chúng không phải là một lựa chọn, bạn chỉ cần sử dụng cú pháp sql là "as";) –
đúng là bạn có một điểm :) – AgentKnopf
Nếu bạn đang ở trong một Hoạt động và không muốn gây rối với QueryBuilder, hãy thực hiện thao tác sau đây, điều này cũng hiệu quả.
Cursor cursor = getHelper().getReadableDatabase().query(tableName, projection, selection, selectionArgs, groupBy, having, sortOrder)
làm cách nào tôi có thể có được kết nối cơ sở dữ liệu? – max4ever
Tôi đã thay đổi câu trả lời này để hiển thị cách nó có thể được thực hiện mà không cần kết nối cơ sở dữ liệu. – Gray
@Gray Cách tốt nhất để tăng lượt xem list_item bằng cách sử dụng con trỏ là gì? Ngoài ra, là một 'CursorAdapter' điều tốt nhất để sử dụng với' OrmLiteBaseListActivity' là gì? – theblang