gpt4 book ai didi

Android - 使用 ORMLite DAO 作为 ContentProvider

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:32 26 4
gpt4 key购买 nike

我在 Google IO 演示中看到了模式 C,我非常渴望实现这个模式。不过,我真的很喜欢 ORMLite 库,也想在我的应用程序中使用这个库。

当我说 Google IO 演示文稿时,我指的是这个:https://www.youtube.com/watch?v=xHXn3Kg2IQE Virgil Dobjanschi 着。

现在我一直在寻找一个实现,它向我展示了如何将 ORMLite 与 Contentprovider 结合使用。

现在我的问题是 ORMLite DAO 与 Contentprovider 冲突。他们基本上做同样的事情,并且很难融入彼此。 (Using Ormlite in Conjunction with Android's Content Provider 其他人对此进行了讨论并同意这一说法。)

一些库已经将 ORMLite 实现到 contentprovider API 模式中,一个例子是:https://github.com/blandware/android-atleap

但是,在水下他们仍然将模型恢复为 ContentValues(简单类型)。

Android - Using Dao Pattern with contentProvider这个问题与我 3 年前的情况类似,我建议在下面使用替代解决方案。

@jcwenger 的回答非常有用,但我想知道过去 3 年是否有任何变化。我面临着同样的问题,也许现在 ORMLite 已经成熟,使用 ORMLite 更有值(value)?

我旁边的同事真的非常想使用 ORMLite,因为他不想自己编写任何映射。我知道 atleap 和 Android-OrmLiteContentProvider 项目的存在。这些仅提供 Activity 的光标,我的同事想要模型列表或单个模型。这可以实现吗?

我的同事建议我自己编写 Cursor、SyncAdapter 的实现?和 Contentprovider(无论如何都必须完成)以使用模型。然而,同样的功能仍然可以通过列表等实现吗?将事件传递给 contentobservers 等 Activity ?

这可行吗?

编辑我们很可能会私下使用内容提供者。我们不需要公开这些内容提供者。然而,内容提供者提供的优势是巨大的。当数据更改时,我还能如何通知我的 GUI 进行更新?

我还必须在一个 Activity 中显示来自多个表的数据(连接和其他数据,不包含在同一个表中)并下载图像等。

最佳答案

因为找不到合适的答案,所以经过一段时间的尝试,我是这样解决的:

public class CardProvider extends ContentProvider {

private InternalDatabase dbhelper;
private RuntimeExceptionDao<Card, UUID> cardDao;

/**
* Content authority for this provider.
*/
private static final String AUTHORITY = CardUris.CONTENT_AUTHORITY;

// The constants below represent individual URI routes, as IDs. Every URI pattern recognized by
// this ContentProvider is defined using sUriMatcher.addURI(), and associated with one of these
// IDs.
//
// When a incoming URI is run through sUriMatcher, it will be tested against the defined
// URI patterns, and the corresponding route ID will be returned.
/**
* URI ID for route: /cards
*/
public static final int ROUTE_CARDS = 1;

/**
* URI ID for route: /cards/{ID}
*/
public static final int ROUTE_CARDS_ID = 2;

/**
* UriMatcher, used to decode incoming URIs.
*/
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sUriMatcher.addURI(AUTHORITY, "cards", ROUTE_CARDS);
sUriMatcher.addURI(AUTHORITY, "cards/*", ROUTE_CARDS_ID);
}

@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// TODO Auto-generated method stub
return 0;
}

@Override
public String getType(Uri uri) {
final int match = sUriMatcher.match(uri);
switch (match) {
case ROUTE_CARDS:
return CardUris.CONTENT_CARDS;
case ROUTE_CARDS_ID:
return CardUris.CONTENT_ITEM_CARD;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}

@Override
public Uri insert(Uri arg0, ContentValues arg1) {
// TODO Auto-generated method stub
return null;
}

@Override
public boolean onCreate() {
dbhelper = OpenHelperManager.getHelper(getContext(), InternalDatabase.class);
cardDao = dbhelper.getRuntimeExceptionDao(Card.class);
return true;
}

@Override
public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3,
String arg4) {

int uriMatch = sUriMatcher.match(uri);
switch (uriMatch) {
case ROUTE_CARDS_ID:
/*String id = uri.getLastPathSegment();
Card card = null;
try {
card = cardDao.queryBuilder().where().eq(Entry.ID_FIELD_NAME, id).queryForFirst();
} catch (SQLException e) {
e.printStackTrace();
}*/
//return null;
case ROUTE_CARDS:
// Return all known entries.
// Note: Notification URI must be manually set here for loaders to correctly
// register ContentObservers.
// build your query
QueryBuilder<Card, UUID> qb = cardDao.queryBuilder();

// when you are done, prepare your query and build an iterator
CloseableIterator<Card> iterator = null;
Cursor cursor = null;
try {
//qb.query();
iterator = cardDao.iterator(qb.where().eq("relevant", 1).and().eq("removed", false).prepare());
// get the raw results which can be cast under Android
AndroidDatabaseResults results =
(AndroidDatabaseResults)iterator.getRawResults();
cursor = results.getRawCursor();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//iterator.closeQuietly();
}
cursor.setNotificationUri(this.getContext().getContentResolver(), uri);
return cursor;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}

}

@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
// TODO Auto-generated method stub
return 0;
}

}

您可能会给插入、更新和删除方法指定目的,但 dao 也这样做,这就是我正在使用的。

关于Android - 使用 ORMLite DAO 作为 ContentProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23951176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com