2016-12-30 16 views
7

私は2つのアクティビティを持っています。コンテンツプロバイダはSqliteDatabaseと同期していません

ActivityAは、コンテンツプロバイダを通じてデータベースにアクセスし、ActivityBを開始します。

ActivityBはデータベースに直接アクセスします。

ActivityBがデータベースを更新した後に見つかりましたActivityA CPでデータベースを照会しても結果は更新されません。

しかし、データベースは実際に更新されています!

2つの方法を同期するにはどうすればよいですか?

PS:ActivityAActivityBは別のアプリケーションにあります。

+0

本当にデータベース共有が必要ですか?私は共有優先度共有のためのコードを持っています。これで十分ですか? –

+1

データベース操作コードを送信します。 –

+2

あなたのコードはどこにありますかnotifyChange()の呼び出しがありません – danny117

答えて

-1

アクティビティbが更新されたときに、カーソルまたはdbヘルパーでclose()に電話してください。

+0

これは私には正しいようではない。たとえば、http://stackoverflow.com/questions/14267176/closing-the-sqlitedatabase-in-a-content-provider?rq=1 – Hod

+0

Googleのドキュメントでは同じことが言います。しかし、彼らはまだonDestroyで閉じることをお勧めします。下にスクロールします:https://developer.android.com/training/basics/data-storage/databases.html#PersistingDbConnection –

2

礼儀の連絡として更新するコンテンツプロバイダNotifyChangeコンテンツプロバイダの購読者にコンテンツが変更されたことを通知するためです。

アクティビティAは、コンテンツプロバイダにURIでアクセスし、コンテンツオブザーバを登録する必要があります。アクティビティBは、変更のオブザーバが行ベースのURIを受け取るように、行ベースのURIでNotifyChangeを呼び出す必要があります。すべては、contentproviderにアクセスするために使用されるURIに依存します。これにより、リアルタイムでb-Aが変更されます。 B changes >>> 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); 
} 

// ***************** ******** ------- 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で) ; ....

データ操作とデータベース操作での使用操作... データを取得した後でdbを閉じると、 2つのアクティビティに共通のデータベースメソッドを使用してください。これはあなたに役立つことを願っています..

関連する問題