【问题标题】:Content Provider not Sync with SqliteDatabase内容提供程序不与 SqliteDatabase 同步
【发布时间】:2016-12-30 11:33:19
【问题描述】:

我有 2 个活动。

ActivityA通过Content Provider访问数据库,并启动ActivityB

ActivityB直接访问数据库。

发现ActivityB更新数据库后,ActivityACP查询数据库,结果不会更新。

但是数据库实际上已经更新了!

这两种方法如何同步?

PS:ActivityAActivityB 在不同的应用程序中。

【问题讨论】:

  • 您真的想要数据库共享吗?我有共享偏好共享的代码。这对你来说够了吗?
  • 发布您的数据库操作代码。
  • 你的代码在哪里你错过了对 notifyChange() 的调用
  • ActivityA 是一个启动器,它启动 ActivityB。我调用了 notifyChange() 但当 ActivityA 再次读取数据库时没有更新。如果两个活动都由 Content Provider 操作数据库,结果就OK了。如果从系统->应用程序强制停止activityA或activityB,结果也可以。
  • 为什么您不想导出内容提供程序并从两个应用程序中使用它们?

标签: android


【解决方案1】:

当您作为礼节性电话更新时的内容提供商NotifyChange 这是为了通知您的内容提供商的订阅者内容已更改。

Activity A 需要通过 URI 访问内容提供者并注册一个内容观察者。活动 B 需要使用基于行的 URI 调用 NotifyChange,以便更改的观察者将收到基于行的 URI。一切都取决于用于访问 contentprovider 的 URI。这给出了实时变化 b-A。 B 更改 >>> A 收到更改并可以对它们做一些事情。

Notification/Event for row and column level observation in Content Provider

Reload or notify Fragment's data in ViewPager

Content Provider Update

【讨论】:

    【解决方案2】:

    ** 数据库**

      @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
    
    
        db.execSQL("CREATE TABLE " + TABLE_NAME
                + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, " + key_msg + " STRING, " + key_isread + " STRING)");
    
    
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
    

    //*************************--------插入 GCM 消息---------* *************************//

    public void insert_GCM_receive_data(String msg) {
    
        String value;
        SQLiteDatabase db = getWritableDatabase();
    
        ContentValues cv = new ContentValues();
    
        cv.put(key_msg, msg);
        cv.put(key_isread, "N");
    
        value = cv.toString();
    
        db.insert(TABLE_NAME, null, cv);
        System.out.println("/n******this is temp table name  " + TABLE_NAME + "\nthis is temp msg  " + cv + "\nmsg" + msg + "\nval" + value);
    
        db.close();
    
    }
    

    //--------------------------------------------- --------------------------------------------------//

    //**********************----------获取警报数据---------- --******************************// 公共 ArrayList get_alert_msg() {

        ArrayList<String> name = new ArrayList<String>();
        try {
            SQLiteDatabase db = getWritableDatabase();
            Cursor c = null;
            c = db.rawQuery("SELECT  * FROM " + TABLE_NAME, null);
    
            System.out.println(c);
    
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
    
                String str_id = c.getString(0);
                String str_msg = c.getString(1);
                String str_read = c.getString(2);
                Log.e("value", str_id + str_msg + str_read);
    
                HashMap<String, String> hm = new HashMap<String, String>();
                hm.put("msg", str_msg);
                hm.put("isread", str_read);
    
    
                name.add(str_msg);
    
    
            }
            c.close();
            db.close();
    
        } catch (Exception e) {
            Log.e("this not work", "" + e);
        }
    
        return name;
    }
    

    //调用方法如2活动 dbHelper.get_alert_msg(); ....

    数据库类中的数据操作和检索操作使用... 一旦您在检索数据后关闭数据库。 对两个活动使用通用数据库方法..希望这对您有所帮助..

    【讨论】:

      【解决方案3】:

      当活动b 完成更新时,确保在游标或数据库助手上调用close()

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多