2014-07-22 1 views
2

짧은 버전 : 액티비티와 서비스의 특정 메시지에 대한 액세스 기록을 유지하는 가장 좋은 방법은 무엇입니까?활동과 서비스 모두에서 기록을 관리하는 가장 좋은 방법은 무엇입니까?

긴 버전 : 나는 (는) 활동도, 아니고 서비스도 제공하고 있습니다. 개체에 메시지 로그 (기록)를 보관하여 파일에 보관하고 예를 들면 다음과 같이 할 수 있습니다. 항목을 삭제하십시오.

서비스 내역과 활동 내역에서 동기화 문제가 발생했습니다. 그래서, 어떤 조언, 가장 좋은 해결책은 무엇일까요?

  • 이상적으로 나는 서비스와 활동 모두에서 이력 클래스의 메소드를 사용할 수 있습니다. 아마 불가능합니다.
  • 각 작업에서 파일을 읽고 쓸 수있었습니다. 장기적으로는별로 효율적이지 않을 수 있습니다.
  • 역사에 대한 서비스를 설정하고 인 텐트를 통해 모든 작업을 처리해야합니까?

"proper way to access DB from both Activity and a started Service?"과 약간 비슷하지만 SQLite DB 대신 자신 만의 클래스가 있습니다.

어떤 조언이 필요합니까?


결론 : SQLite는-DB와 컨텐트 프로를 사용합니다. 코드의 짧은 버전 :

package com.example.history; 

import android.content.ContentProvider; 
import android.content.ContentUris; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.UriMatcher; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.net.Uri; 

public class HistoryContentProvider extends ContentProvider { 

    static final String PROVIDER_NAME = "com.example.HistoryContentProvider"; 
    static final String URL = "content://" + PROVIDER_NAME + "/history"; 
    static final Uri CONTENT_URI = Uri.parse(URL); 

    static final String id = "id"; 
    static final String normalized_number = "normalized_number"; 
    static final String display_name = "display_name"; 

    static final int uriCode = 1; 
    static final UriMatcher uriMatcher; 
    static { 
     uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
     uriMatcher.addURI(PROVIDER_NAME, "history", uriCode); 
    } 

    @Override 
    public boolean onCreate() { 
     Context context = getContext(); 
     DatabaseHelper dbHelper = new DatabaseHelper(context); 
     db = dbHelper.getWritableDatabase(); 
     if (db != null) { 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
     SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
     qb.setTables(TABLE_NAME); 

     Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder); 
     c.setNotificationUri(getContext().getContentResolver(), uri); 
     return c; 
    } 

    @Override 
    public String getType(Uri uri) { 
     switch (uriMatcher.match(uri)) { 
     case uriCode: 
      return "vnd.android.cursor.dir/history"; 
     default: 
      throw new IllegalArgumentException("Unsupported URI: " + uri); 
     } } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     long rowID = db.insert(TABLE_NAME, "", values); 
     if (rowID > 0) { 
      Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); 
      getContext().getContentResolver().notifyChange(_uri, null); 
      return _uri; 
     } 
     throw new SQLException("Failed to add a record into " + uri); 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     int count = 0; 
     switch (uriMatcher.match(uri)) { 
     case uriCode: 
      count = db.delete(TABLE_NAME, selection, selectionArgs); 
      getContext().getContentResolver().notifyChange(uri, null); 
      break; 
     default: 
      throw new IllegalArgumentException("Unknown URI " + uri); 
     } 
     return count; 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, 
      String[] selectionArgs) { 
     int count = 0; 
     switch (uriMatcher.match(uri)) { 
     case uriCode: 
      count = db.update(TABLE_NAME, values, selection, selectionArgs); 
      getContext().getContentResolver().notifyChange(uri, null); 
      break; 
     default: 
      throw new IllegalArgumentException("Unknown URI " + uri); 
     } 
     return count; 
    } 

    private SQLiteDatabase db; 
    static final String DATABASE_NAME = "historyDb"; 
    static final String TABLE_NAME = "history"; 
    static final int DATABASE_VERSION = 3; 
    static final String CREATE_DB_TABLE = " CREATE TABLE " + TABLE_NAME 
      + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + normalized_number + " TEXT NOT NULL, " 
      + display_name + " TEXT NOT NULL, "; 

    private static class DatabaseHelper extends SQLiteOpenHelper { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CREATE_DB_TABLE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
      onCreate(db); 
     } 
    } 

} 
+0

왜 데이터베이스를 사용하지 않습니까? 이것에 완벽 할 것입니다.그리고 귀하의 질문에 관한 :'ContentProvider'는 당신이 찾고있는 것입니다. –

+0

@XaverKapeller 당신 말이 맞아요. 이제는 개인 SQLite 데이터베이스에서'ContentProvider'를 사용합니다. [유용한 링크] (http://examples.javacodegeeks.com/android/core/content/contentprovider/android-content-provider-example) –

+0

문제가 해결되었다는 뜻입니까? 아니면 도움이 더 필요하십니까? –

답변

1

나는 (는) 활동과 서비스 중 서비스가 있거나 어떤 서비스를 가지고 있습니다. I 개체에 메시지 로그 (기록)를 보관하고 파일에 보관하고 싶다면 예를 들어. 항목을 삭제하십시오.

정확한 설명은 ContentProvider입니다. Link to documentation.

ContentResolver 인스턴스를 사용하여 ContentProvider의 데이터에 액세스 할 수 있습니다. Activity 또는 Service이 될 수 있습니다. ContentProviderContentResolver은 이미 대부분의 작업을 처리하며 기본적으로 데이터 저장 방법을 구현해야합니다 (ContentProvider). 나머지는 이미 처리되었습니다! ContentProviderSQLiteDatabase과 함께 사용하도록 설계되었을 수 있습니다. 데이터베이스를 사용하는 것이 좋지만 다른 방법으로 데이터를 저장하지 못하게하는 것은 없습니다.

+0

오른쪽. 나는 ContentProvider를 정리하고 여기에 코드를 게시 할 수있다 ... 좋은 일 이겠니? :-) (Geeez, 어떻게 내 이름을 내 실명으로 바꿀 수 있습니까?!?!) –

+0

질문을 향상시키는 것은 항상 좋은 일입니다! –

+0

프로필에서 표시 이름을 변경할 수 있습니다. 상단의 수정을 클릭하거나 [**이 링크 **] (http://stackoverflow.com/users/edit/3864922)를 따르십시오. –