ViewModel
管理ui数据的 不要持有Activity,View这些;配合livedata使用;自动管理了数据的保存
使用
public class xxx extends ViewModel
...xxActivity...
...onCreate...
xxViewModel = ViewModelProviders.of(getActivity()).get(xxx.class);
原理
以屏幕切换为例
- 横竖屏幕切换时,借用CompanentActivity.onRetainNonConfigurationInstance() 系统调用的保存状态方法,把ViewModelProvider.of()里面的ViewModelStore保存到NonConfigurationInstances实例里面;
实际是AMS里面通过LocalActivityManager.LocalActivityRecord记录的 - ComponentActivity.getLastNonConfigurationInstance()恢复状态回来。
- 在ComponentActivity 的构造方法中 onDestory里面做的clear。
room
使用
- 创建实体
@Entity
public class XxEntity{
@PrimaryKey(autoGenerate=true)
privite int id;
@CloumnInfo(name = "xxname")//数据库里面字段名称
private String xxname;
...
}
- dao
@Dao
public interface XxDao{
@Insert
void insert(XxEntity xx);
@Delete
void delete(XxEntity xx);
@Update
void update(XxEntity xx);
@Query("select * from XxEntity")
LiveData<List<XxEntity>> query();
}
3.数据库
@Database(entities = {XxEntity.class,XxxEntity.class...}, version = 2, exportSchema= true)
public abstract class Mydatabase extends RoomDatabase{
private static Mydatabase instance;
public static synchronized Mydatabase getInstance(Context context){
if(instance == null){
instance = Room.databaseBuilder(context.getApplicationContext(), XxEntity.class, "xxdatabasename").addMigrations(oneToTwo).build();
}
return instance;
}
public abstranct XxDao xxDao();
static finall Migration oneToTwo = new Migration(1, 2){
@Override
public void migration(@NonNull SupportSQLiteDatabase database){
database.execSQL("要 升级的语句写这里");
}
}
}
XxRepository
实际使用的时候处理个仓库提供个隔离层,推荐用hint来做。XxViewModel extends AndroidViewModel
使用XxRepository中的调用 使其拥有数据库功能。activity用 的时候给viewModel中的LiveData 添加观察者就用了。