IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 树莓派提升计划 Android应用用MiniChatAppApp的App数据源处理 -> 正文阅读

[移动开发]树莓派提升计划 Android应用用MiniChatAppApp的App数据源处理

2021SC@SDUSC

一、基本构成介绍

Repository 模式:

App 开发中少不了对数据的操作,数据的来源可能有很多种:网络、数据库、文件以及内存中的缓存。而 Repository 就相当于一个仓库管理员,管理这些数据的存储。当业务层想要获取或者存储数据时,只需要通过 Repository 的管理员进行操作。这样的好处就是:屏蔽数据来源的操作接口对于业务层来说不必关心数据存在哪里,以及如何存储的。而且也符合我们组件化/模块化架构设计的思想。即当我们更换数据存储设备时,例如从 Android 系统 Sqlite 数据转换为第三方的数据库时,不会影响到业务逻辑。

当前端需要调动后端执行一个动作时,前端ui将动作执行委托给viewmodel,viewmodel调用 respository中执行,在repository中根据情况选择从本地存储读取还是从网络读取,一般情况下优先选 择存储读取。repository应该是单例的,以免造成存在多个repository存在,造成本地数据库与网络数据 混淆,数据库数据不一致。

设计模式

?

二、datasource与repository

1.FriendAddDataSource

package com.example.minichatapp.data.friends;

import androidx.lifecycle.LiveData;

import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.Friend;
import com.example.minichatapp.db.model.FriendRoom;

import java.util.List;

public class FriendRepository {
    private static volatile FriendRepository instance;
    private FriendDataSource dataSource;

    public static FriendRepository getInstance(FriendDataSource dataSource) {
        if(instance==null){
            instance=new FriendRepository(dataSource);
        }
        return instance;
    }
    private FriendRepository(FriendDataSource dataSource){
        this.dataSource=dataSource;
    }

    public Result<List<Friend>> getFriends(String uid){
        return dataSource.getFriends(uid);
    }
    public LiveData<List<FriendRoom>> getFriendLiveData(){
        return dataSource.getFriendsLiveData();
    }
}

2. FriendAddRepository

package com.example.minichatapp.data.friends;

import android.os.AsyncTask;

import com.example.minichatapp.App;
import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.Friend;
import com.example.minichatapp.db.APPDataBase;
import com.example.minichatapp.db.model.FriendRoom;

public class FriendAddRepository {
    private static volatile FriendAddRepository instance;
    private FriendAddDataSource dataSource;

    public static FriendAddRepository getInstance(FriendAddDataSource source) {
        if(instance==null){
            instance=new FriendAddRepository(source);
        }
        return instance;
    }

    public FriendAddRepository(FriendAddDataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void setFriend(Friend friend){
        //load into local storage
        FriendRoom friendRoom=new FriendRoom(friend.getFid(),friend.getUid(),friend.getF_name(),friend.getNick_name());
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                APPDataBase db= App.getInstance().getDataBase();
                db.friendDao().insertFriendOne(friendRoom).blockingSubscribe();
            }
        });

    }
    public Result<Friend> addFriend(String uid,String f_id){
        Result<Friend> friendResult=dataSource.addFriend(uid,f_id);
        if(friendResult instanceof Result.Success){
            setFriend(((Result.Success<Friend>) friendResult).getData());
        }
        return friendResult;
    }
}

3.FriendDataSource

package com.example.minichatapp.data.friends;

import android.os.AsyncTask;
import android.util.Log;

import androidx.lifecycle.LiveData;


import com.example.minichatapp.App;
import com.example.minichatapp.NetService.Base.HpException;
import com.example.minichatapp.NetService.HpImpl.friend.FriendHpImpl;
import com.example.minichatapp.NetService.HpModel.Response.FriendResponse;
import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.Friend;
import com.example.minichatapp.db.dao.FriendDao;
import com.example.minichatapp.db.model.FriendRoom;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FriendDataSource {
    private LiveData<List<FriendRoom>> friendsLiveData;
    private final FriendDao dao;
    public FriendDataSource() {
        dao= App.getInstance().getDataBase().friendDao();
        //friendsLiveData=dao.getFriendsByUId(uid);
    }
    public Result<List<Friend>> getFriends(String uid){
        List<Friend> friendList=new ArrayList<>();
        //if (friendsLiveData==null||friendsLiveData.getValue()==null){
            List<FriendRoom> friendRoomList=new ArrayList<>();
            //remote
            try{
                List<FriendResponse> responseList=new FriendHpImpl().getFriendsById(uid);
                for(FriendResponse response:responseList){
                    if (response.getCode()>0){
                        friendList.add(new Friend(response.getFid(),response.getUid(),response.getF_name(),response.getNick_name()));
                        friendRoomList.add(new FriendRoom(response.getFid(),response.getUid(),response.getF_name(),response.getNick_name()));
                    }else {
                        return new Result.Error(new IOException("Error fetching friends"));
                    }
                }
                //load into room
                AsyncTask.execute(new Runnable() {
                    @Override
                    public void run() {
                        if(friendRoomList.size()>0){
                            dao.insertFriends(friendRoomList).blockingSubscribe();
                            friendsLiveData=dao.getFriendsByUId(uid);
                        }
                    }
                });
            }catch (HpException hp){
                return new Result.Error(new Exception("NetService was shut down."));
            }
        for (Friend f:friendList
             ) {
            Log.d("friendListItme",f.toString());
        }
//        }else {
//            //room
//            List<FriendRoom> friendRoomList=friendsLiveData.getValue();
//            for (FriendRoom friendRoom:friendRoomList){
//                friendList.add(new Friend(friendRoom.fid,friendRoom.uid,friendRoom.f_name,friendRoom.nick_name));
//            }
//        }
        return new Result.Success<>(friendList);
    }

    public LiveData<List<FriendRoom>> getFriendsLiveData() {
        return friendsLiveData;
    }
}

4.FriendRepository

package com.example.minichatapp.data.friends;

import androidx.lifecycle.LiveData;

import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.Friend;
import com.example.minichatapp.db.model.FriendRoom;

import java.util.List;

public class FriendRepository {
    private static volatile FriendRepository instance;
    private FriendDataSource dataSource;

    public static FriendRepository getInstance(FriendDataSource dataSource) {
        if(instance==null){
            instance=new FriendRepository(dataSource);
        }
        return instance;
    }
    private FriendRepository(FriendDataSource dataSource){
        this.dataSource=dataSource;
    }

    public Result<List<Friend>> getFriends(String uid){
        return dataSource.getFriends(uid);
    }
    public LiveData<List<FriendRoom>> getFriendLiveData(){
        return dataSource.getFriendsLiveData();
    }
}

(二)个人主页

1.Homedatasource?

package com.example.minichatapp.data.home;

import com.example.minichatapp.App;
import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.User;
import com.example.minichatapp.db.APPDataBase;
import com.example.minichatapp.db.model.UserRoom;

import java.io.IOException;

import io.reactivex.rxjava3.core.Single;

public class HomeDataSource {
    public Result<User> getUser(){
        //访问数据库,并返回信息
        APPDataBase appDataBase= App.getInstance().getDataBase();
        Single<UserRoom> userSingle=appDataBase.userDao().getLogUser();
        try{
            UserRoom u=userSingle.blockingGet();
            User user=new User(u.uid,u.userName);
            return new Result.Success<>(user);
        }catch (NullPointerException e){
            return new Result.Error(new IOException("Error getUser in",e));
        }
    }
}

?2.Homerepository

package com.example.minichatapp.data.home;

import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.User;

public class HomeRepository {
    private static volatile HomeRepository instance;
    private HomeDataSource dataSource;

    private HomeRepository(HomeDataSource dataSource)
    {
        this.dataSource=dataSource;
    }
    public static HomeRepository getInstance(HomeDataSource dataSource){
        if(instance==null){
            instance=new HomeRepository(dataSource);
        }
        return instance;
    }
    public Result<User> getUser(){
        Result<User> user=dataSource.getUser();
        return user;
    }

}

(三)登录

1. Logindatasource

package com.example.minichatapp.data.login;

import com.example.minichatapp.NetService.HpImpl.login.LoginHpImpl;
import com.example.minichatapp.NetService.HpModel.Response.LoginResponse;
import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.LoggedInUser;

import java.io.IOException;


public class LoginDataSource {

    public Result<LoggedInUser> login(String uid, String password) {

        try {
            // 网络登录操作
            LoginResponse response=new LoginHpImpl().login(uid,password);
            LoggedInUser user=null;
            if(response.getCode()>0){
                user =
                        new LoggedInUser(true,
                                uid,response.getName(),response.getToken()
                        );
            }else {
                user =
                        new LoggedInUser(false,
                                null,null,null
                        );
            }
            return new Result.Success<>(user);
        } catch (Exception e) {
            return new Result.Error(new IOException("Error logging in", e));
        }
    }

}

2.Loginrespository

package com.example.minichatapp.data.login;

import android.os.AsyncTask;
import android.util.Log;

import com.example.minichatapp.App;
import com.example.minichatapp.data.Result;
import com.example.minichatapp.data.model.LoggedInUser;
import com.example.minichatapp.db.APPDataBase;
import com.example.minichatapp.db.model.UserRoom;


public class LoginRepository {

    private static volatile LoginRepository instance;

    private LoginDataSource dataSource;

    // If user credentials will be cached in local storage, it is recommended it be encrypted
    private LoggedInUser user = null;

    // private constructor : singleton access
    private LoginRepository(LoginDataSource dataSource) {
        this.dataSource = dataSource;
    }

    public static LoginRepository getInstance(LoginDataSource dataSource) {
        if (instance == null) {
            instance = new LoginRepository(dataSource);
        }
        return instance;
    }

    public boolean isLoggedIn() {
        return user != null;
    }


    private void setLoggedInUser(LoggedInUser user) {
        this.user = user;
        UserRoom u=new UserRoom();
        u.uid=user.getUserId();
        u.userName=user.getDisplayName();
        u.isLog=1;
        APPDataBase db=App.getInstance().getDataBase();
        //先修改isLog=true用于切换账号
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                db.userDao().updateLog().blockingSubscribe();
                db.userDao().delete(u.uid).blockingSubscribe();
                Log.d("userRoomLogin",u.toString());
                db.userDao().insertOne(u).blockingSubscribe();
            }
        });
    }

    public Result<LoggedInUser> login(String username, String password) {
        // handle login
        Result<LoggedInUser> result = dataSource.login(username, password);
        if (result instanceof Result.Success) {
            LoggedInUser loggedInUser=((Result.Success<LoggedInUser>) result).getData();
            if(loggedInUser.isOk()){
                setLoggedInUser(loggedInUser);
            }
        }
        return result;
    }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:56:35  更:2021-12-13 12:57:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:23:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码