首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RoboSpice和ORMLite -访问数据

RoboSpice和ORMLite -访问数据
EN

Stack Overflow用户
提问于 2014-01-02 21:15:06
回答 1查看 1.6K关注 0票数 4

我刚刚开始为一个新的安卓应用程序使用RoboSpice。RoboSpice与ORMLite和SpringAndroidSpiceService一起用于从REST服务中读取JSON。

现在,我设法:

  • 创建自定义SpiceService
  • 很少请求从WS获取数据
  • 使用ORMLite将数据持久化到DB

..。多亏了“知更鸟-样本-莫来石”样品

我的应用程序的主要部分(下面的问题):

BaseActivity

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)和其他活动组成。启动屏幕几秒钟后启动MainActivity (暂时只是一个定时器)。

我想要做的是从启动屏幕(RoboSpice已经在SQLite DB中缓存/保存这些数据)下载所有数据,然后从其他活动访问它。

问题1:可以访问和操作SplashActivity之外的数据库数据吗?如何(您可以提供一些代码示例)?

Wiki页面关于"RoboSpiceDataBaseHelper“的内容对我来说不是很清楚:有人说"RoboSpiceDataBaseHelper用于管理数据库创建和版本管理”,但在下一段中,有人说有些方法允许“从数据库中查询和检索数据”。在RoboSpice示例中,没有任何关于从其他活动检索数据的内容。如何利用ORMLite的力量?

我从这个Google组主题上读到了Snicolas:

注意,RoboSpice缓存应该是透明的,并且完全封装在SpiceService中。应该能够通过共享引用(由服务和活动共享)直接访问缓存系统(在您的例子中是数据库)。此外,在这种情况下,没有什么可以防止副作用,如并发访问或数据库不一致。

那么,怎么做?我完全迷路了

编辑03/01:由于我缺乏RoboSpice和ORMLite的能力,我很困惑如何实现这样的解决方案/自己来实现(至少是高效的)。我不知道如何使用/组合RoboSpiceDatabaseHelper,InDatabaseObjectPersister,InDatabaseObjectPersisterFactory.

问题2:

我的最后一个问题与数据访问无关(我想问这个话题)。

为什么getSpiceManager().execute(barsRequest, new Integer(1), DurationInMillis.ONE_HOUR, null)什么也不做(不回调RequestListener)?事实上,在我的例子中(启动屏幕),我不需要回调。我能避免吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-01-03 13:45:36

问题1:

您必须在您的服务和要访问它的位置之间共享RoboSpiceDatabaseHelper

最干净的方法是使用像RoboGuice这样的注入框架。快速和肮脏的攻击是为这个实例创建一个静态提供程序,或者更脏、更快地使RoboSpiceDatabaseHelper成为一个单例。

-更新

在使用RoboGuice时,可以:

创建您自己的RoboSpiceDatabaseHelper类--用@Singleton注释它:

代码语言:javascript
复制
@Singleton
public class MyRoboSpiceDatabaseHelper extends RoboSpiceDatabaseHelper {
...
}

在您的提示服务和需要访问数据库的类中,您可以声明如下所示的成员:

代码语言:javascript
复制
@Inject
RoboSpiceDatabaseHelper databaseHelper;

然后,您将获得一个适当的单例,允许您共享数据库访问。

问题2:

如果您确实需要快速运行,只需创建一个存根/虚拟侦听器即可。没有侦听器,RS不会执行请求。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20892020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档