我正在阅读关于Android的房间库.我看到他们改变包装android来androidx.我不明白.请有人解释一下.
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
Run Code Online (Sandbox Code Playgroud)
即使这也适用于android包装.
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
Run Code Online (Sandbox Code Playgroud)
androidx而不是android.android android-architecture-components android-jetpack androidx
我没有理由在Android中使用RxJava,在Android Architectural Components中使用LiveData.如果两者之间的用例和差异以及代码形式的示例示例进行解释,这将解释两者之间的差异,这将非常有用.
android rx-android reactive rx-java2 android-architecture-components
如何使用Room Persistence Library删除特定表上的所有条目?我需要删除表,但我无法找到任何信息如何执行此操作.
仅在数据库迁移或加载所有条目并删除它们时:)
随着Android架构组件库的引入,引入了几个新类,包括AndroidViewModel和ViewModel.但是,我无法弄清楚这两个类之间的区别.该文件,简要地描述AndroidViewModel如下:
应用上下文感知
ViewModel
我很欣赏这种简洁,但究竟是什么意思呢?我们什么时候应该选择使用AndroidViewModel,ViewModel反之亦然?
嘿我想让我的ViewModel工作,但到目前为止没有运气.Android Studio显示错误Cannot resolve symbol 'ViewModelProviders'.
我在这个题目中找到的每个其他问题被修正extends Activity到extends AppCompatActivity,但我延长正确的.不确定我错过了什么...
我的代码基于此YouTube视频
MainActivity.java
public class MainActivity extends AppCompatActivity implements
TileAdapter.TileAdapterOnClickHandler {
private BaseViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//set Toolbar
Toolbar myToolbar = findViewById(R.id.toolbar);
setSupportActionBar(myToolbar);
//initialize viewModel
viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);
Run Code Online (Sandbox Code Playgroud)
BaseViewModel.java
public class BaseViewModel extends ViewModel {
private Movie[] mMovie;
public void init (Movie[] movies){
this.mMovie = movies;
}
public Movie[] getMovie() {
return mMovie;
}
Run Code Online (Sandbox Code Playgroud) 最近我正在探索谷歌最近推出的Android架构.从文档中我发现了这个:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
Run Code Online (Sandbox Code Playgroud)
活动可以按如下方式访问此列表:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在loadUsers()我正在异步获取数据的函数中,我将首先检查数据库(Room)中的数据,如果我没有得到数据,我将进行API调用以从Web服务器获取数据.然后我将获取的数据插入数据库(Room)并根据数据更新UI.建议的方法是什么?
如果我开始Service从loadUsers()方法中调用API ,我该如何更新MutableLiveData<List<User>> users …
android background-service viewmodel android-room android-architecture-components
Android的Room持久性库慷慨地包含适用于对象或集合的@Insert和@Update注释.然而,我有一个用例(包含模型的推送通知)需要UPSERT,因为数据可能存在或可能不存在于数据库中.
Sqlite本身没有upsert,并且在这个SO问题中描述了变通方法.鉴于那里的解决方案,如何将它们应用于房间?
更具体地说,如何在Room中实现不会破坏任何外键约束的插入或更新?使用带onConflict = REPLACE的insert将导致onDelete调用该行的任何外键.在我的情况下,onDelete导致级联,重新插入行将导致其他表中的行与外键被删除.这不是预期的行为.
我正在使用Android中的新导航架构组件,我在移动到新片段后陷入清理导航堆栈.
示例:我在loginFragment中,当我导航到主片段时,我希望从堆栈中清除此片段,以便用户在按下后退按钮时不会返回到loginFragment.
我正在使用一个简单的NavHostFragment.findNavController(Fragment).navigate(R.id.homeFragment)进行导航.
现行代码:
mAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
} else {
Log.w(TAG, "signInWithCredential:failure", task.getException());
}
}
});
Run Code Online (Sandbox Code Playgroud)
我尝试在navigate()中使用NavOptions,但后退按钮仍然将我发送回loginFragment
NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);
Run Code Online (Sandbox Code Playgroud) android android-fragments android-architecture-components android-architecture-navigation
它看起来MutableLiveData不同于LiveData仅将the setValue()和postValue()方法公开,而在LiveData它们受到保护的情况下.
为这种变化创建一个单独的类的原因是什么,而不是简单地将这些方法定义为公共的LiveData?
一般来说,这种继承形式(增加某些方法的可见性是唯一的变化)是一种众所周知的做法,以及它可能有用的一些场景(假设我们可以访问所有代码)?
oop android android-livedata android-architecture-components
简短的问题:
使用使用页面大小加载新页面和BoundaryCallback类的API,从Architecture组件处理Paging库上的数据库+网络的正确方法是什么?
研究和解释
目前,BoundaryCallback在用于体系结构组件的分页库中使用的类接收列表中元素的实例作为参数,而没有该元素所在的实际上下文.它发生在onItemAtFrontLoaded和onItemAtEndLoaded.
我的Api应该接收页面和页面大小以加载下一个数据块.作为分页列表构建器的一部分添加的边界回调应该告诉您何时根据预取距离和页面大小加载下一页数据.
由于API需要的页码和页面提供的尺寸,我看不到的方式发送到API只是通过接收从列表中提供的元素之一onItemAtFrontLoaded和onItemAtEndLoaded.检查此链接中的google示例,他们使用最后一个元素的名称来获取下一个元素,但这不适合具有页面+大小的Api.
他们还有另一个只使用网络的例子PagedKeyedDatasource,但没有关于如何将它与数据库和BoundaryCallback混合的样本或线索.
编辑:到目前为止我找到的解决方案只是将最后加载的页面存储在共享首选项上,但这听起来像是一个肮脏的技巧.
有关官方输入,请参阅 https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468.
android android-room android-livedata android-architecture-components android-paging
android ×10
android-architecture-components ×10
android-room ×4
viewmodel ×2
android-architecture-navigation ×1
androidx ×1
mvvm ×1
oop ×1
reactive ×1
rx-android ×1
rx-java2 ×1
sqlite ×1