单人房间数据库及开启和关闭流程应该如何?

问题描述 投票:0回答:1

我在我的应用程序中使用多个房间数据库。我想在必要的活动中打开它,然后在 on destroy 方法中关闭它,但有时可能会出现延迟。我需要做出更好的改进。您能否更正这个简单的示例并创建一个文档?

数据库类

@Database(entities = {UserFood.class}, version = 1, exportSchema = false)
public abstract class UserFoodDatabase extends RoomDatabase {
    public abstract UserFoodDao daoAccess();

    public static volatile UserFoodDatabase userFoodDatabase;

    public static UserFoodDatabase getDatabase(final Context context) {
        if (userFoodDatabase == null) {
            synchronized (UserFoodDatabase.class) {
                if (userFoodDatabase == null) {
                    userFoodDatabase = Room.databaseBuilder(context.getApplicationContext(),
                                    UserFoodDatabase.class, USER_FOODS_DB_NAME)
                            .build();
                }
            }
        }
        return userFoodDatabase;
    }
}

单例助手类

public class AppDatabaseHelper {
    private static volatile UserFoodDatabase userFoodDatabase;

    public static UserFoodDatabase getUserFoodDatabase(Context context) {
        if (userFoodDatabase == null) {
            userFoodDatabase = UserFoodDatabase.getDatabase(context);
        }
        return userFoodDatabase;
    }

    public static void closeUserFoodDatabase() {
        if (userFoodDatabase != null) {
            if (userFoodDatabase.isOpen()) {
                userFoodDatabase.close();
            }
            if (userFoodDatabase != null) {
                userFoodDatabase = null;
            }
        }
    }
  }

一些活动

public class FoodListActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_list);

ExecutorService executor = Executors.newSingleThreadExecutor();
        Handler handler = new Handler(Looper.getMainLooper());
        executor.execute(() -> {
            UserFoodDao userFoodDao = AppDatabaseHelper.getUserFoodDatabase(FoodListActivity.this).daoAccess();
            handler.post(this::dataLoadMethod);
            executor.shutdown();
        });
}

    @Override
    protected void onDestroy() {
        Log.d("LIFECYCLE", "onDestroy");
        new Thread(() -> {
            AppDatabaseHelper.closeUserFoodDatabase();
        }).start();
        super.onDestroy();
    }
  }

我创建了单例帮助器类,但我无法确定它是否正确。另外,房间数据库中的打开、关闭、重新打开操作是如何进行的?

java android android-room
1个回答
0
投票

用户食品数据库:

public abstract class UserFoodDatabase extends RoomDatabase {
    public abstract UserFoodDao daoAccess();

    private static final String USER_FOODS_DB_NAME = "user_foods_db";
    private static UserFoodDatabase userFoodDatabaseInstance;

    public static UserFoodDatabase getDatabase(final Context context) {
        if (userFoodDatabaseInstance == null) {
            synchronized (UserFoodDatabase.class) {
                if (userFoodDatabaseInstance == null) {
                    userFoodDatabaseInstance = Room.databaseBuilder(context.getApplicationContext(),
                                    UserFoodDatabase.class, USER_FOODS_DB_NAME)
                            .build();
                }
            }
        }
        return userFoodDatabaseInstance;
    }
}

应用程序数据库助手:

public class AppDatabaseHelper {
    private static volatile UserFoodDatabase userFoodDatabaseInstance;

    public static UserFoodDatabase getUserFoodDatabase(Context context) {
        if (userFoodDatabaseInstance == null) {
            userFoodDatabaseInstance = UserFoodDatabase.getDatabase(context);
        }
        return userFoodDatabaseInstance;
    }

    public static void closeUserFoodDatabase() {
        if (userFoodDatabaseInstance != null && userFoodDatabaseInstance.isOpen()) {
            userFoodDatabaseInstance.close();
        }
    }
}

食物清单活动:

public class FoodListActivity extends AppCompatActivity {
    private ExecutorService executor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_list);

        executor = Executors.newSingleThreadExecutor();
        executor.execute(() -> {
            UserFoodDao userFoodDao = AppDatabaseHelper.getUserFoodDatabase(FoodListActivity.this).daoAccess();
            runOnUiThread(this::dataLoadMethod); 
        });
    }

    @Override
    protected void onDestroy() {
        Log.d("LIFECYCLE", "onDestroy");
        executor.shutdown(); // Properly shut down the executor
        AppDatabaseHelper.closeUserFoodDatabase();
        super.onDestroy();
    }
}

这些更改可确保 Android 应用程序中 Room 数据库的正确初始化、使用和关闭,并更好地处理线程和潜在延迟。

© www.soinside.com 2019 - 2024. All rights reserved.