小编Dev*_*cie的帖子

Android Room - 使用自动生成获取新插入行的ID

这是我使用Room Persistence Library将数据插入数据库的方法:

实体:

@Entity
class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    //...
}
Run Code Online (Sandbox Code Playgroud)

数据访问对象:

@Dao
public interface UserDao{
    @Insert(onConflict = IGNORE)
    void insertUser(User user);
    //...
}
Run Code Online (Sandbox Code Playgroud)

在上述方法本身完成插入后,是否可以返回User的id而无需编写单独的select查询?

android persistent-storage android-room

104
推荐指数
7
解决办法
5万
查看次数

查看使用Room Persistence Library创建的数据库的内容

有没有更简单的方法来查看在Android Studio中使用Room Persistence Library创建的数据库的内容?

android android-room

67
推荐指数
8
解决办法
3万
查看次数

使用共享 ViewModel 的多个片段中的单个实时事件

我在多个片段中有一个共享视图模型。

class MainFragment {
      private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}

class MagazinesFragment {
      private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}
Run Code Online (Sandbox Code Playgroud)

我在该共享视图模型中有一个事件。

class HomeActivityViewModel{
       val userAuthStatusChanges = MutableLiveData<Boolean>()
}
Run Code Online (Sandbox Code Playgroud)

我正在多个片段中观察该事件。

 class MainFragment {
       //...
          sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
            // do smth
        }
    }
    
 class MagazinesFragment {
         //...
          sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
            // do smth
        }
    }
Run Code Online (Sandbox Code Playgroud)

每当该userAuthStatusChanges事件发生时,我想在观察该事件的所有片段中触发单个实时事件。

如果我将事件设置为 MutableLiveData,则每当重新创建片段时都会观察到该事件。如果我使用SingleLiveEvent,则该事件仅被观察到一次并且仅在一个片段中被观察到。

我希望在所有片段中触发此事件,并且每个片段中仅触发一次。我正在使用导航组件。

android android-mvvm android-livedata android-jetpack

8
推荐指数
1
解决办法
1688
查看次数

房间持久性库:尝试重新打开已经关闭的对象

当我使用1.0.0-alpha5版本的房间持久性库时,一切都运行正常.但是,在更新到1.0.0-alpha9版本后,我收到此错误:

java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase:/ data/data/package_name/databases/app_db

我怎么解决这个问题?

编辑:

我正在使用带有匕首2的MVP架构.我有DatabaseHelper类来初始化RoomDatabase:

@Singleton
public class DatabaseHelper {

private final AppDatabase appDatabase;

@Inject
public DatabaseHelper(@ApplicationContext Context context) {
    appDatabase = Room.databaseBuilder(context, AppDatabase.class, "app_db").build();        
}

public List<DifficultyEntity> getAllDifficulties() {
        return appDatabase.difficultyDao().getAllDifficulties();
}
Run Code Online (Sandbox Code Playgroud)

我的RoomDatabase:

@Database(version = 22, entities = {
        DifficultyEntity.class, // ....
})
@Singleton
public abstract class AppDatabase extends RoomDatabase {

    public abstract DifficultyDao difficultyDao();
    //....
}
Run Code Online (Sandbox Code Playgroud)

当我调用getAllDifficulties方法时,我收到了这个错误.

这是logcat:

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/package_name/databases/app_db
       at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
       at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1783)
       at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1729)
       at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.execSQL(FrameworkSQLiteDatabase.java:241) …
Run Code Online (Sandbox Code Playgroud)

sqlite android android-room

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

当布尔值改变时,Pandas 增量值

有一个数据框,其中包含布尔值交替的列。我想根据这些布尔变化创建增量值系列。我只想在布尔值与之前的值不同时增加。我想在没有循环的情况下执行此操作。

例如,这是数据框:

   column
0    True
1    True
2   False
3   False
4   False
5    True
Run Code Online (Sandbox Code Playgroud)

我想得到这个:

 column  inc
0    True    1
1    True    1
2   False    2
3   False    2
4   False    2
5    True    3
Run Code Online (Sandbox Code Playgroud)

python numpy pandas

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

如何在数据绑定中不将参数传递给具有默认值的参数

是否可以在不传递参数的情况下使用 XML 中的默认参数调用 Kotlin 函数

这是我的视图模型:

class MyViewModel: ViewModel(){

    fun doSomething(myVar: String = "defValue"){

    }
}
Run Code Online (Sandbox Code Playgroud)

XML:

....
<data>
    <variable
        name="viewModel"
        type="com.example.MyViewModel" />
</data>
....
android:onClick="@{(view) -> viewModel.doSomething()}"  --> ERROR
android:onClick="@{(view) -> viewModel.doSomething(`SomeString`)}"  --> WORKING
....
Run Code Online (Sandbox Code Playgroud)

当我使用数据绑定从 XML调用不带参数doSomething方法时,出现错误。

[databinding] {"msg":"cannot find method doSomething() in class com.example.MyViewModel","file":"app\\src\\main\\res\\layout\\fragment_list.xml","pos":[{"line0":56,"col0":41,"line1":56,"col1":65}]}
Run Code Online (Sandbox Code Playgroud)

android android-xml kotlin android-databinding

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

更新了导航框架并收到错误 -“getActionId 不覆盖任何内容”

我已将导航框架从 2.3.5 更新到 2.4.0-alpha01 版本。我将它与 Safe Args gradle 插件一起使用。更新后,我开始出现'getActionId' overrides nothing错误'getArguments' overrides nothing

我认为发生这种情况是因为 Safe Args在生成 Direction 类时不正确地覆盖了actionIdarguments字段。NavDirections

例如,这是正在生成的内容:

 public override fun getActionId(): Int =
        R.id.action_navigation_articles_to_articleReaderFragment
Run Code Online (Sandbox Code Playgroud)

这是应该生成的:

public override val actionId: Int = R.id.action_navigation_articles_to_articleReaderFragment
Run Code Online (Sandbox Code Playgroud)

如何获得安全参数来生成正确的构建器类?

android android-navigation android-architecture-navigation android-safe-args

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

使用数据绑定库将基本类型导入布局

我需要在项目布局中使用一个单独的布尔变量,该变量打算用作的一行recyclerView,以切换其中某些视图的状态。

我知道,我可以选择将布尔值包含在模型类中并使用它。我很好奇,是否有可能借助数据绑定库在布局内使用基本类型。

android mvvm android-databinding

2
推荐指数
1
解决办法
1215
查看次数