首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SQLBrite逻辑提取到Android中的外部类

将SQLBrite逻辑提取到Android中的外部类
EN

Stack Overflow用户
提问于 2015-05-07 10:10:09
回答 1查看 325关注 0票数 2

在我的聊天应用程序中,我使用SQLBrite包装器更新本地数据库中的聊天。目前,我的活动包含UI和SQLBrite。现在,我想将SQLBrite逻辑提取到外部类。所以,当我的活动还活着的时候,我需要我提取的SQLBrite也是活着的。目前我对订户有问题。我还将它提取到外部类中,并且它一直在发出查询,尽管所有的事情都与它在活动中的情况相同,而且它正在工作。

这是一段旧代码,所有的东西都在同一个活动中:我是如何做到的?

代码语言:javascript
复制
SqlBrite sqlBrite;
sqlBrite = SqlBrite.create(DatabaseManager.DatabaseHelper);
private final CompositeSubscription subscriptions = new CompositeSubscription();

private void saveMessage(Message message) {

        ContentValues values = new ContentValues();
        values.put(DatabaseContract.MessageEntry.COLUMN_NAME_MESSAGE_ID, message.getId());
        values.put(DatabaseContract.MessageEntry.COLUMN_NAME_SERIAL_NUMBER, message.getSerialNumber());
        values.put(DatabaseContract.MessageEntry.COLUMN_NAME_TEXT, message.getText());

        sqlBrite.insert(DatabaseContract.MessageEntry.TABLE_NAME, values, SQLiteDatabase.CONFLICT_IGNORE);
    }

    private void subscribeToDbChanges() {
        String NEW_MSG_QUERY = "SELECT * FROM "
                + DatabaseContract.MessageEntry.TABLE_NAME
                + " WHERE "
                + DatabaseContract.MessageEntry.COLUMN_NAME_CREATED_AT_MILLS
                + " >= ? ORDER BY "
                + DatabaseContract.MessageEntry.COLUMN_NAME_CREATED_AT_MILLS
                + " DESC";

        String grpId = String.valueOf(groupId);
        String msgDate = String.valueOf(dividerMsgDate);

        Observable<Query> freshMessages = sqlBrite.createQuery(DatabaseContract.MessageEntry.TABLE_NAME, NEW_MSG_QUERY, grpId, msgDate);
        subscriptions.add(
                freshMessages.subscribe(query -> parseQueryData(query)));
    }

    private void parseQueryData(Query query) {
        Log.d(TAG, "subscriber called");
        List<Message> messages = new ArrayList<>();
        Cursor c = query.run();
        try {
            while (c.moveToNext()) {
                Message message = new Message();
                message.setLocalId(c.getInt(c.getColumnIndexOrThrow(DatabaseContract.MessageEntry._ID)));
                message.setId(c.getInt(c.getColumnIndexOrThrow(DatabaseContract.MessageEntry.COLUMN_NAME_MESSAGE_ID)));

                messages.add(message);
            }
        } finally {
            c.close();
        }

        updateChatList(messages, "new");
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-10 09:26:10

我不能100%肯定我理解您的问题,但是我会用上面提供的代码创建一个SQLBrite帮助类,并在活动的onCreate()中实例化它。

此外,您还必须将onResume()和onPause()事件传递给您的助手类(因为只有在活动处于活动状态时才需要它),并通过回调返回结果。

代码语言:javascript
复制
 MyActivity.java


 public class MyActivity extends Activity implements SQLHelper.ResultListener {

   SQLHelper mSQLHelper;

   public void onCreate() {
     mSQLHelper = new SQLHelper(this);
   }


   public void onResume() {
     mSQLHelper.onResume();
   }


   public void onPause() {
     mSQLHelper.onPause();
   }

   @
   Override
   public void onUpdateChatList(String _message) {
     //show it
   }
 }


 SQLHelper.java

 public class SQLHelper {

   ResultListener mListener;

   public interface ResultListener {
     public void onUpdateChatList(String _message);
   }

   public void SQLHelper(ResultListener _resultListener) {
     mListener = _resultListener;
   }


   public void onResume() {
     //Here subscribe to your query
   }


   public void onPause() {
     //here unsubscribe
   }

   private void parseQueryData(Query query) {
     //... your code
     mListener.onUpdateChatList(String _message);
   }
 }

希望这能有所帮助。

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

https://stackoverflow.com/questions/30097987

复制
相关文章

相似问题

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