3

我userDatabase的擴展ContentProvider的的的onCreate不正確稱爲MyContentProvider.onCreate()沒有被調用?

下面是我的一些userBatabase代碼:

public class userDatabase extends ContentProvider { 

    private MainDatabaseHelper mOpenHelper; 

    public userDatabase(){} 

    public static final class MainDatabaseHelper extends SQLiteOpenHelper{...} 

    @Override 
    public boolean onCreate() { 
     mOpenHelper = new MainDatabaseHelper(getContext());  
     return true; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     long id = mOpenHelper.getWritableDatabase().insert("Users", null, values); 
     return Uri.withAppendedPath(CONTENT_URI, "" + id); 
    } 

    ... 
} 

在我的主要活動我打電話:

userDatabase cpDatabase = new userDatabase(); 

但是,當我嘗試撥打電話cpDatabase.insert(userDatabase.CONTENT_URI, values);

mOpenHelper.getWritableDatabase().insert("Users", null, values);被調用。

我發現mOpenHelper.getWritableDatabase()是問題,因爲它甚至不會自行運行,然後我發現這是因爲mOpenHelper爲空。

我在構造函數中實例化mOpenHelper,所以我認爲它沒有運行。有幾條日誌消息證實了這一點,當我打電話給userDatabase cpDatabase = new userDatabase();時,我的日誌消息顯示userDatabase()構造函數運行正常,但onCreate從未運行,所以mOpenHelper從未實例化過。我注意到我的userDatabase的構造函數和onCreate在我的應用程序啓動時被調用,我不知道爲什麼或者在哪裏,我不明白爲什麼在我嘗試創建之前運行它一個實例,即使它運行,mOpenHelper仍然沒有初始化,當我創建一個實例,構造函數運行,但onCreate沒有。)

什麼可能發生,以及如何使我的onCreate跑?

回答

6

由於您使用的內容提供商,根據documentation

這種方法被稱爲在應用程序啓動時

你的方式 應用程序的主線程上的所有註冊內容提供商嘗試使用內容提供者似乎是錯誤的,並且, 您不需要手動實例化內容提供者,一旦通過傳遞URI通過ContentResolver發出請求,系統就會檢查gi的權限ven URI並將請求傳遞給在該機構註冊的內容提供者。

例如

getContentResolver().delete(uri, null, null); 

凡URI是完整URI查詢。

This教程將指導您在正確的方向