小编Ale*_*ioc的帖子

备份室数据库

我正在尝试以编程方式备份​​房间数据库.

为此,我只是复制.sqlite包含整个数据库的文件

但是,在复制之前,由于房间已启用提前写入日志,我们必须关闭数据库,以便将-shm文件和-wal文件合并为单个.sqlite文件.正如这里指出的那样

.close()RoomDatabase对象上运行:

一切正常,备份,但是,稍后,当我尝试执行INSERT查询时,我收到此错误:

android.database.sqlite.SQLiteException: no such table: room_table_modification_log (code 1)
Run Code Online (Sandbox Code Playgroud)

关闭后如何才能正确地重新打开房间数据库?

PS:.isOpen()RoomDatabase对象返回trueINSERT

房间版: 1.1.1-rc1

sqlite android sqliteopenhelper android-room android-architecture-components

16
推荐指数
3
解决办法
4766
查看次数

如何使用 Google Play 结算库获取应用内产品或订阅的“福利”?

我正在使用Google Play 结算库版本 3 来获取可用的应用内产品和订阅。

querySkuDetailsAsync调用该对象后BillingClient,我正确地获取了SkuDetails每个产品的 。

在 Google Play 控制台中,我在“福利”字段中输入了一些福利,但是,我没有看到任何获取它们的方法。

我可以获得产品的名称、价格、描述,但无法获得好处。


Google Play 管理中心 - 应用内产品


我如何获得应用内产品或订阅的好处?

android google-play google-play-console

11
推荐指数
1
解决办法
467
查看次数

重新打开 ROOM 数据库

我正在尝试关闭然后重新打开 Room 数据库。(目的是备份SQLite文件)

这是我关闭它的方式:

public static void destroyInstance() {
    if (INSTANCE != null && INSTANCE.isOpen()) {
        INSTANCE.close();
    }
    INSTANCE = null;
}
Run Code Online (Sandbox Code Playgroud)

INSTANCE 是一个RoomDatabase对象

并重新打开我通过调用再次初始化 INSTANCE 对象:

Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, C.ROOM_DB_NAME)
Run Code Online (Sandbox Code Playgroud)

在我转到另一个活动后,我在 logcat 中看到此错误: E/ROOM: Invalidation tracker is initialized twice

SELECT 查询工作正常,但 INSERT 失败并出现以下错误:

E/SQLiteLog: (1) no such table: room_table_modification_log

E/ROOM: Cannot run invalidation tracker. Is the db closed?
java.lang.IllegalStateException: The database '/data/user/0/ro.example.example/databases/mi_room.db' is not open.
Run Code Online (Sandbox Code Playgroud)

虽然 INSTANCE.isOpen() 返回 true

房间版本:1.1.1

有谁知道这个“room_table_modification_log”表是什么?

android android-sqlite android-room

7
推荐指数
1
解决办法
2622
查看次数

房间数据库事务回滚

使用房间数据库,我从不同DELETE的.INSERTDAO's

我将交易用作:

myDb.runInTransaction(new Runnable() {
     @Override
     public void run() {
     }
});
Run Code Online (Sandbox Code Playgroud)

有没有办法ROLLBACK万一出现任何问题?

稍后编辑: 使用这种模式似乎有效:

myDb.beginTransaction();
if(success){
 myDb.setTransactionSuccessful(); -> commit
}
myDb.endTransaction();
Run Code Online (Sandbox Code Playgroud)

sqlite android android-room

5
推荐指数
1
解决办法
7334
查看次数

使用 Google Play 计费库以不同语言显示应用内产品详细信息

我正在使用Google Play 结算库版本 3 来获取可用的应用内产品。

querySkuDetailsAsync调用该对象后BillingClient,我正确获取了每个产品的SkuDetails 。

在 Google Play 管理中心中,我将产品详细信息翻译成多种语言。但是,我仅获得主要语言的详细信息。

如何获取不同语言的应用内商品详细信息?

android android-inapp-purchase google-play-console

5
推荐指数
1
解决办法
595
查看次数

从片段导航时底部导航栏出现故障

我将底部导航栏与导航组件一起使用

为了使这两个组件协同工作,我调用了:

bottomNavigationView.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,除非我从片段内部而不是底部导航栏导航

在此输入图像描述

“查看全部”从底部导航栏打开与“报告”相同的片段

binding.viewAllScansTv.setOnClickListener {
    val action = MainFragmentDirections.actionMainFragmentToReportsFragment()
    navController.navigate(action)
}
Run Code Online (Sandbox Code Playgroud)

单击“查看全部”后,片段将打开,“报告”按钮被选中,但是,导航回“主页”不再起作用

我该如何解决这种奇怪的行为?

导航图:

<navigation app:startDestination="@id/mainFragment">
    <fragment
        android:id="@+id/mainFragment"
        android:name="com.package.name.ui.main.MainFragment"
        android:label="MainFragment"> 
        <action                android:id="@+id/action_mainFragment_to_reportsFragment"
            app:destination="@id/reportsFragment" />
    </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

底部导航菜单:

<menu>
    <item
        android:id="@+id/mainFragment"
        android:title="Home"/>    
    <item
        android:id="@+id/reportsFragment"
        android:title="Reports"/>
    <item
        android:id="@+id/settingsFragment"
        android:title="My account"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

navigation android bottomnavigationview

5
推荐指数
1
解决办法
3164
查看次数