将 Dagger2 与数据库一起使用

Using Dagger2 with Database

我正在尝试在我的 android 应用程序中使用 dagger2 和数据库。我无法通过注入操作访问数据库 class。我创建的数据库 db 对象返回空值。我是 dagger2 的新手。感谢您的帮助。

这是我的数据库class。

public  class Database extends SQLiteOpenHelper {


@Inject
public Database(@ApplicationContext Context context) {
    super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION);
}

public void createTables(){..}

public void clearAllTables() {...}

public void dropTable(SQLiteDatabase db, String tableName){
    db.execSQL("DROP TABLE IF EXISTS " + tableName);
}

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

这是我的模块。

@Module abstract public class DatabaseModule {

private Application application;
public DatabaseModule(Application application) {
    this.application = application;
}
@Provides
@ApplicationContext
Context provideContext() {
    return application;
}}

和组件

@ActivityScope @Subcomponent public interface DatabaseSubcomponent {

@ApplicationContext
Context getContext();

Database getDb(); }

Db 对象 returns 空如下:

   @Inject
Database db;

如果你能告诉我哪里出错了,我将不胜感激。提前致谢。

为自己定义一个范围注释器@DatabaseScope.java

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface DatabaseScope {
}

然后 DatabaseModule.java 应该提供上下文和数据库对象,这是你的模块(在注入数据库对象期间,匕首会自动从对象图中为你注入上下文)

@Module
public class DatabaseModule {

    private Application application;

    public DatabaseModule(Application application){

        this.application = application;
    }

    @Provides
    @DatabaseScope
    Context provideContext(){
        return application;
    }

    @Provides
    @DatabaseScope
    Database provideDatabase(Context context){
        return new Database(context);
    }
}

然后是 DatabaseComponent.java 。您不需要将其注释为子组件

@DatabaseScope
@Component(modules = {DatabaseModule.class})
public interface DatabaseComponent {
    void inject(MainActivity mainActivity);
}

然后是你的database.java

public  class Database extends Object {

    public Database(Context context) {
        Log.e("database creted"," ");
    }

    String getmessage(){
        return "jenison";
    }

}

最后将其注入您的 activity

public class MainActivity extends AppCompatActivity {

    @Inject
    Database db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DatabaseComponent component=DaggerDatabaseComponent.builder().databaseModule(new DatabaseModule(getApplication())).build();
        component.inject(this);
        Log.e("test"," "+db.getmessage());
    }
}