android - 将 Dagger2 与数据库一起使用

标签 android database nullpointerexception dagger

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

这是我的数据库类。

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 对象返回 null 如下:

   @Inject
Database db;

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

最佳答案

为自己定义一个作用域注释器@DatabaseScope.java

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

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

@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";
    }

}

最后将其注入(inject)到您的 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());
    }
}

关于android - 将 Dagger2 与数据库一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47773455/

相关文章:

android - 使用 RectangleF 时 Xamarin.forms 错误

MySQL:为什么 Select .. IN with subquery 不能使用索引

sql - 用于插入脚本的生产就绪模板

Android Api 23 更改导航 View headerLayout textview

java - 处理库方法抛出的 Null 吗?

android - 专有文件格式或加密以限制对文件的访问 (Android)

Android:以编程方式释放位图内存资源

android - 使用 NDK 时 C 文件出现错误

mysql - SQL 语法错误,我没有看到它

java - 相机 "Bitmap imageBitmap = (Bitmap) extras.get("数据");"给出 Nullpointer 错误