2016-12-30 85 views
7

我有2个活动。内容提供者不与SqliteDatabase同步

ActivityA通过Content Provider访问数据库,它开始ActivityB

ActivityB直接访问数据库。

我发现ActivityB更新了数据库,ActivityA通过CP查询数据库,结果不会更新。

但数据库实际上已更新!

如何同步这两种方法?

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

+0

你真的想要数据库共享吗?我有共享偏好分享代码..这对你来说足够了吗? –

+1

发布您的数据库操作代码。 –

+2

您的代码在哪里?您错过了notifyChange()的呼叫 – danny117

回答

-1

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

+0

这对我来说似乎不正确。请参阅http://stackoverflow.com/questions/14267176/closing-the-qlitedatabase-in-a-content-provider?rq=1 – Hod

+0

谷歌的文档也会提到同样的东西,种类。但他们仍然建议关闭onDestroy。滚动到底部:https://developer.android.com/training/basics/data-storage/databases.html#PersistingDbConnection –

2

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

活动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

+0

我已经做到了,但没有成功。 – timyau

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); 
} 

// ***************** ******** ------- INSERT GCM MESSAGE --------- *********************** *** //

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(); 

} 

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

// *** ******************* ---------- GET ALERT DATA ------------ ****** ******************** // 公共的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() ; ....

在数据库类中使用数据操作和检索操作... 在检索数据后关闭数据库。 使用通用数据库方法进行两项活动..我希望这会对你有所帮助。