我刚开始将 RoboSpice 用于一个新的 Android 应用程序。 RoboSpice 与 ORMLite 和 SpringAndroidSpiceService 一起使用以从 REST Web 服务读取 JSON。
目前,我设法:
... 感谢 "robospice-sample-ormlite" sample .
我的应用程序的主要部分(底部的问题):
基础 Activity
public abstract class BaseActivity extends RoboActivity {
private SpiceManager spiceManager = new SpiceManager(MySpiceService.class);
@Override
protected void onStart() {
super.onStart();
spiceManager.start(this);
}
@Override
protected void onStop() {
if (spiceManager.isStarted()) {
spiceManager.shouldStop();
}
super.onStop();
}
protected SpiceManager getSpiceManager() {
return spiceManager;
}
}
SplashActivity
public class SplashActivity extends BaseActivity {
...
@Override
protected void onStart() {
super.onStart();
...
getSpiceManager().execute(foosRequest, new Integer(0), DurationInMillis.ONE_HOUR, new FoosRequestListener());
getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, new BarsRequestListener());
// Start MainActivity after X seconds (handler + startActivity(intent...)
...
}
public final class FoosRequestListener implements RequestListener<Foos> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Toast.makeText(MainActivity.this, "failure foo", Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestSuccess(final Days result) {
Toast.makeText(MainActivity.this, "success foo", Toast.LENGTH_SHORT).show();
String originalText = getString(R.string.textview_text);
mLoremTextView.setText(originalText + result.getResult().iterator().next().getMoonrise());
}
}
public final class BarsRequestListener implements RequestListener<Bars> {
@Override
public void onRequestFailure(SpiceException spiceException) {
Toast.makeText(MainActivity.this, "failure bars", Toast.LENGTH_SHOR ).show();
}
@Override
public void onRequestSuccess(final Months result) {
Toast.makeText(MainActivity.this, "success bars", Toast.LENGTH_SHORT).show();
}
}
}
MySpiceService
public class MySpiceService extends SpringAndroidSpiceService {
...
@Override
public CacheManager createCacheManager(Application application) throws CacheCreationException {
CacheManager cacheManager = new CacheManager();
List<Class<?>> classCollection = new ArrayList< Class< ? >>();
// Add persisted classe(s) to class collection
classCollection.add(Foos.class); // Collection of "Foo"
classCollection.add(Foo.class);
classCollection.add(Bars.class); // Collection of "Bars"
classCollection.add(Bar.class);
// Init
RoboSpiceDatabaseHelper databaseHelper = new RoboSpiceDatabaseHelper(application, DATABASE_NAME, DATABASE_VERSION);
InDatabaseObjectPersisterFactory inDatabaseObjectPersisterFactory = new InDatabaseObjectPersisterFactory(application, databaseHelper, classCollection);
cacheManager.addPersister(inDatabaseObjectPersisterFactory);
return cacheManager;
}
@Override
public RestTemplate createRestTemplate() {
...
return restTemplate;
}
}
应用程序由启动画面(SplashActivity)和其他 Activity 组成。启动画面在几秒钟后启动 MainActivity(目前只是一个计时器)。
我想做的是从启动画面下载所有数据(RoboSpice 已经缓存/将这些数据保存在 SQLite 数据库中),然后从其他 Activity 访问它。
问题 1: 是否可以在 SplashActivity 之外访问和操作数据库数据?如何(你能提供一些代码示例)?
The Wiki page关于“RoboSpiceDataBaseHelper”我不是很清楚:据说“RoboSpiceDataBaseHelper 用于管理数据库创建和版本管理”,但在下一段中指出某些方法允许“从数据库查询和检索数据”。在 RoboSpice 样本中,没有关于从其他 Activity 中检索数据的内容。如何利用 ORMLite 的强大功能?
我已经阅读了 this Google Groups topic来自 Snicolas:
Note that RoboSpice caching is meant to be transparent and is completely encapsulated in the SpiceService. It should be possilbe to access the cache system (in your case the databse) directly through a shared reference to it (shared by the service and your activities). Also, in that case, nothing will prevent side-effects like concurrent access or database inconsistency.
那么,怎么办? 我完全迷路了:(
编辑 03/01:由于我缺乏 RoboSpice 和 ORMLite 的能力,我很困惑如何实现这样的解决方案/如何自己做(至少有效)。我不知道如何使用/组合 RoboSpiceDatabaseHelper、InDatabaseObjectPersister、InDatabaseObjectPersisterFactory...
问题 2:
我的最后一个问题与数据访问无关(我带着这个话题来问)。
为什么 getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, null) 什么都不做(没有回调到 RequestListener)?事实上,就我而言(启动画面),我不需要回调。我能避免吗?
谢谢!
最佳答案
问题一:
您必须在您的服务和您想要访问它的地方之间共享 RoboSpiceDatabaseHelper。
最干净的方法是使用像 RoboGuice 这样的注入(inject)框架。一个快速而肮脏的 hack 是为此实例创建一个静态提供者,或者甚至更肮脏和更快,使 RoboSpiceDatabaseHelper 成为单例。
---更新
在使用 RoboGuice 时,您可以:
创建您自己的 RoboSpiceDatabaseHelper 类并使用 @Singleton 对其进行注释:
@Singleton
public class MyRoboSpiceDatabaseHelper extends RoboSpiceDatabaseHelper {
...
}
在您的 spiceservice 和需要访问数据库的类中,您可以声明一个成员:
@Inject
RoboSpiceDatabaseHelper databaseHelper;
然后您将获得一个合适的单例,允许您共享数据库访问。
问题二:
如果您真的需要快速进行,只需创建一个 stub /虚拟监听器即可。 RS 不会在没有监听器的情况下执行请求。
关于java - RoboSpice 和 ORMLite - 访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20892020/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_