Commit 5754d75f authored by hywang's avatar hywang

锡盟固定架项目

parents
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.phlx.anchorcollect"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled true
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
}
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.phlx.anchorcollect.db.gen'
targetGenDir 'src/main/java'
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation files('libs\\uhf.jar')
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//EventBus's
implementation 'org.greenrobot:eventbus:3.2.0'
implementation 'org.greenrobot:greendao:3.2.2'
implementation 'io.github.yuweiguocn:GreenDaoUpgradeHelper:v2.2.1'
// TinyPinyin核心包,约80KB
implementation 'com.github.promeg:tinypinyin:2.0.3'
implementation 'com.github.promeg:tinypinyin-lexicons-android-cncity:2.0.3'
//图片加载
implementation 'de.hdodenhof:circleimageview:3.1.0'
//下拉刷新,上拉加载
implementation 'com.lcodecorex:tkrefreshlayout:1.0.7'
// 基础依赖包,必须要依赖
implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
//时间选择器
implementation 'com.contrarywind:Android-PickerView:4.1.9'
implementation project(':mvvmhabit')
implementation project(':appupdateX')
implementation files('libs/uhf.jar')
//生成主键
implementation 'cn.hutool:hutool-all:4.5.6'
//图片加载
implementation 'com.github.YancyYe:GalleryPick:1.2.1'
implementation 'androidx.cardview:cardview:1.0.0'
//autoSize
implementation 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1'
//dialog
//添加对应的包文件,可根据需要选择,请将 dialogx_version 的版本号与您正在使用的 DialogX 主库保持一致
implementation "com.github.kongzue.DialogX:DialogXKongzueStyle:0.0.43.beta19"
implementation "com.github.kongzue.DialogX:DialogX:0.0.43.beta19"
//日期选择对话框
implementation 'com.github.kongzue.DialogXSample:DatePicker:0.0.1.alpha7'
//BLE
implementation 'cn.wandersnail:easyble-x:1.2.8'
implementation 'cn.wandersnail:commons-android:1.3.0'
//bt
implementation 'cn.wandersnail:classic-bluetooth:1.0.7'
// implementation 'cn.wandersnail:commons-android:1.0.7'
// fragmentationx框架
implementation 'me.yokeyword:fragmentationx:1.0.2'
//ToastUtils
implementation 'com.github.getActivity:ToastUtils:9.2'
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
package com.phlx.anchorcollect;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.phlx.anchorcollect", appContext.getPackageName());
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.phlx.anchorcollect">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION " />
<application
android:name="App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.phlx.anchorcollect.file_provider"
android:exported="false"
android:grantUriPermissions="true"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<activity
android:name=".ui.login.LoginActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.main.MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.splash.SplashActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.home.HomeActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.info.CattleActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.setting.BtSettingActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize" />
<service
android:name=".bt.BtService"
android:enabled="true"
android:exported="true"
android:persistent="true"/>
<meta-data
android:name="design_width_in_dp"
android:value="640"/>
<meta-data
android:name="design_height_in_dp"
android:value="360"/>
</application>
</manifest>
\ No newline at end of file
package com.phlx.anchorcollect;
import android.graphics.Typeface;
import com.kongzue.dialogx.DialogX;
import com.kongzue.dialogx.style.KongzueStyle;
import com.phlx.anchorcollect.entity.DictEntity;
import com.uhf.linkage.Linkage;
import cn.wandersnail.ble.EasyBLE;
import cn.wandersnail.bluetooth.BTManager;
import me.goldze.mvvmhabit.base.BaseApplication;
import me.goldze.mvvmhabit.crash.CaocConfig;
import me.goldze.mvvmhabit.utils.KLog;
public class App extends BaseApplication {
private Linkage link;
private static App instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
//是否开启打印日志
KLog.init(true);
//初始化全局异常崩溃
initCrash();
link = new Linkage();
link.initRFID();
//设置为Kongzue主题
DialogX.init(this);
DialogX.globalStyle = new KongzueStyle();
//加入外挂字体
Configs.typeface = Typeface.createFromAsset(getAssets(), "IMPACT.TTF");
//初始化字典项
initDict();
//实例化并初始化
// EasyBLE.getInstance().initialize(this)
BTManager.getInstance().initialize(this);
}
public static App getInstance() {
return instance;
}
private void initCrash() {
CaocConfig.Builder.create()
.backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT) //背景模式,开启沉浸式
.enabled(true) //是否启动全局异常捕获
.showErrorDetails(true) //是否显示错误详细信息
.showRestartButton(true) //是否显示重启按钮
.trackActivities(true) //是否跟踪Activity
.minTimeBetweenCrashesMs(2000) //崩溃的间隔时间(毫秒)
.errorDrawable(R.mipmap.ic_launcher) //错误图标
.apply();
}
public Linkage getLinkage() {
if (link == null) {
link = new Linkage();
link.initRFID();
}
return link;
}
private void initDict(){
DictEntity de1 = new DictEntity("001", "安格斯牛", "001", "card_varieties");
Configs.dictList.add(de1);
DictEntity de2 = new DictEntity("002", "鲁西黄牛", "002", "card_varieties");
Configs.dictList.add(de2);
DictEntity de3 = new DictEntity("003", "公", "003", "card_sex");
Configs.dictList.add(de3);
DictEntity de4 = new DictEntity("004", "母", "004", "card_sex");
Configs.dictList.add(de4);
DictEntity de5 = new DictEntity("005", "其他", "005", "card_sex");
Configs.dictList.add(de5);
DictEntity de6 = new DictEntity("006", "圈舍1", "006", "card_circleNo");
Configs.dictList.add(de6);
DictEntity de7 = new DictEntity("007", "圈舍2", "007", "card_circleNo");
Configs.dictList.add(de7);
DictEntity de8 = new DictEntity("008", "圈舍3", "008", "card_circleNo");
Configs.dictList.add(de8);
DictEntity de9 = new DictEntity("009", "是", "009", "card_isTwins");
Configs.dictList.add(de9);
DictEntity de10 = new DictEntity("010", "否", "010", "card_isTwins");
Configs.dictList.add(de10);
DictEntity de11 = new DictEntity("011", "张三", "011", "weight_principal");
Configs.dictList.add(de11);
DictEntity de12 = new DictEntity("012", "李四", "012", "weight_principal");
Configs.dictList.add(de12);
DictEntity de13 = new DictEntity("013", "药品一", "013", "health_drug_name");
Configs.dictList.add(de13);
DictEntity de14 = new DictEntity("014", "药品二", "014", "health_drug_name");
Configs.dictList.add(de14);
DictEntity de15 = new DictEntity("015", "药品三", "015", "health_drug_name");
Configs.dictList.add(de15);
DictEntity de16 = new DictEntity("016", "药品四", "016", "health_drug_name");
Configs.dictList.add(de16);
DictEntity de17 = new DictEntity("017", "20ml/瓶", "017", "health_specifications");
Configs.dictList.add(de17);
DictEntity de18 = new DictEntity("018", "50ml/瓶", "018", "health_specifications");
Configs.dictList.add(de18);
DictEntity de19 = new DictEntity("019", "100ml/瓶", "019", "health_specifications");
Configs.dictList.add(de19);
DictEntity de20 = new DictEntity("020", "口服", "020", "health_methods");
Configs.dictList.add(de20);
DictEntity de21 = new DictEntity("021", "注射", "021", "health_methods");
Configs.dictList.add(de21);
DictEntity de22 = new DictEntity("022", "外用", "022", "health_methods");
Configs.dictList.add(de22);
DictEntity de23 = new DictEntity("023", "疫苗一", "023", "immun_name");
Configs.dictList.add(de23);
DictEntity de24 = new DictEntity("024", "疫苗二", "024", "immun_name");
Configs.dictList.add(de24);
DictEntity de25 = new DictEntity("025", "0058716654", "025", "immun_batch");
Configs.dictList.add(de25);
DictEntity de26 = new DictEntity("026", "0058895548", "026", "immun_batch");
Configs.dictList.add(de26);
DictEntity de27 = new DictEntity("027", "0058991568", "027", "immun_batch");
Configs.dictList.add(de27);
DictEntity de28 = new DictEntity("028", "顺产", "028", "ease_birth");
Configs.dictList.add(de28);
DictEntity de29 = new DictEntity("029", "难产", "029", "ease_birth");
Configs.dictList.add(de29);
DictEntity de30 = new DictEntity("030", "剖腹产", "030", "ease_birth");
Configs.dictList.add(de30);
}
}
package com.phlx.anchorcollect;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Typeface;
import com.phlx.anchorcollect.entity.DictEntity;
import com.phlx.anchorcollect.entity.GenTableColumn;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
* <pre>
* author : lei
* e-mail : 18600395998@163.com
* time : 2020/04/27
* desc :
* version: 1.0
* </pre>
*/
public class Configs {
/**
* 下载apk地址
*/
public static String downloadApk = "/app/download?type=2";
/**
* 是否在线操作
*/
public static boolean isOnLine = false;
/**
* 是否后缀端口
*/
public static boolean isAddPort = true;
//ip port
public static final String SP_APP_IP = "sp_app_ip";
public static final String SP_APP_PORT = "sp_app_port";
//用户信息
public static final String SP_USER_NAME = "sp_user_name";
public static final String SP_ID = "sp_id";
public static final String SP_ROLE_ID = "sp_role_id";
public static final String SP_NAME = "sp_name";
public static final String SP_LOGIN_NAME = "sp_login_name";
public static final String SP_FREQUENCY = "sp_frequency";
public static final String SP_USER_PASSWORD = "sp_user_password";
public static final String SP_USER_EMAIL = "sp_user_email";
public static final String SP_FREQUENCY_CONFIG = "sp_frequency_config";
public static final String SP_USER_PHONE = "sp_user_phone";
public static final String SP_USER_UNIT = "sp_user_unit";
//选择养殖场
public static final String SP_UNIT_NAME = "sp_unit_unit";
public static final String SP_UNIT_CODE = "sp_unit_code";
public static final String SP_UNIT_PHONE = "sp_unit_phone";
public static final String SP_UNIT_ID_CARD = "sp_unit_id_card";
public static final String SP_UNIT_VILLAGE_NAME = "sp_unit_villag_name";
public static final String SP_UNIT_REVISION = "sp_unit_revision";
//type home页面加载fragment类型
public static final String FAMILY_ARCHIVES = "family_archives";
public static final String WEIGHTING_MANAGE = "weighting_manage";
public static final String HEALTH_MANAGE = "health_manage";
public static final String SIGN_MEASURE = "sign_measure";
public static final String IMMUN_MANAGE = "immun_manage";
//0 高频,1低频
public static String FREQUENCY_CONFIG = "1";
/** 蓝牙 */
public static boolean isConnected = false;// 蓝牙连接状态
public static final String DEVICEADDRESS = "deviceAddress";
public static String DEVICENAME = "deviceName";
//外挂字体
public static Typeface typeface;
//页面结构
public static List<GenTableColumn> cattleresume;
public static List<GenTableColumn> performance;
public static List<GenTableColumn> weightMan;
public static List<GenTableColumn> medicalrecords;
public static List<GenTableColumn> immunebatch;
public static List<GenTableColumn> cattlematingMaster;
public static List<GenTableColumn> cattlematingDetaill;
//字典项
public static List<DictEntity> dictList = new ArrayList<>();
//临时存放列表查询tag
public static String tempTag = "";
// public static boolean ISCONNECTED;
public static String packageName(Context context) {
PackageManager manager = context.getPackageManager();
String name = null;
try {
PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
name = info.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return name;
}
}
package com.phlx.anchorcollect.ble;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.hjq.toast.ToastUtils;
import com.phlx.anchorcollect.R;
import com.phlx.anchorcollect.event.EventKey;
import com.phlx.anchorcollect.event.EventMsg;
import com.phlx.anchorcollect.event.EventUtils;
import com.phlx.anchorcollect.util.ConstantUtil;
import java.util.List;
import cn.wandersnail.ble.Connection;
import cn.wandersnail.ble.Device;
import cn.wandersnail.ble.EasyBLE;
import cn.wandersnail.ble.EventObserver;
import cn.wandersnail.ble.Request;
import cn.wandersnail.ble.RequestBuilder;
import cn.wandersnail.ble.RequestBuilderFactory;
import cn.wandersnail.ble.RequestType;
import cn.wandersnail.ble.callback.MtuChangeCallback;
import cn.wandersnail.ble.callback.NotificationChangeCallback;
import cn.wandersnail.commons.observer.Observe;
import cn.wandersnail.commons.poster.RunOn;
import cn.wandersnail.commons.poster.Tag;
import cn.wandersnail.commons.poster.ThreadMode;
import me.yokeyword.fragmentation.SupportActivity;
/**
* <pre>
* author : lei
* e-mail : 18600395998@163.com
* time : 2020/06/01
* desc :
* version: 1.0
* </pre>
*/
public class BleDialog extends SupportActivity implements EventObserver {
private BleManagers bleManagers;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Device device = getIntent().getParcelableExtra("device");
setContentView(R.layout.activity_ble_connect);
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
getWindow().setGravity(Gravity.CENTER);
EasyBLE.getInstance().registerObserver(this);
bleManagers = BleManagers.from(this);
bleManagers.connectBleDevice(device);
}
/**
* 使用{@link Observe}确定要接收消息,{@link RunOn}指定在主线程执行方法,设置{@link Tag}防混淆后找不到方法
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Tag("onConnectionStateChanged")
@Observe
@RunOn(ThreadMode.MAIN)
@Override
public void onConnectionStateChanged(@NonNull Device device) {
switch (device.getConnectionState()) {
case SCANNING_FOR_RECONNECTION:
break;
case DISCONNECTED:
finish();
ToastUtils.show("蓝牙已断开");
EventUtils.post(new EventMsg(EventKey.KEY_BLUETOOTH_CONNECT_FAILED));
break;
case SERVICE_DISCOVERED:
List<BluetoothGattService> services = bleManagers.getConnection().getGatt().getServices();
for (BluetoothGattService service : services) {
if (!TextUtils.isEmpty(service.getUuid().toString())) {
ConstantUtil.uuid_service = service.getUuid();
List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics();
for (BluetoothGattCharacteristic characteristic : characteristics) {
String characteristicType = getCharacteristicType(characteristic);
if (characteristicType.contains("WRITE")) {
ConstantUtil.uuid_write = characteristic.getUuid();
}
if (characteristicType.contains("NOTIFY")) {
ConstantUtil.uuid_notify = characteristic.getUuid();
boolean isEnabled = bleManagers.getConnection().isNotificationOrIndicationEnabled(ConstantUtil.uuid_service, ConstantUtil.uuid_notify);
if (!isEnabled) {
setNotification(isEnabled);
} else {
bleManagers.startBleService();
}
}
if (characteristicType.contains("INDICATE")) {
ConstantUtil.uuid_indicate = characteristic.getUuid();
}
}
}
}
//设置MTU
Connection connection = EasyBLE.getInstance().getConnection(device);
RequestBuilder<MtuChangeCallback> builder = new RequestBuilderFactory().getChangeMtuBuilder(512);
Request request = builder.setCallback(new MtuChangeCallback() {
@Override
public void onMtuChanged(@NonNull Request request, int mtu) {
Log.e("EasyBLE", "MTU修改成功,新值:" + mtu);
}
@Override
public void onRequestFailed(@NonNull Request request, int failType,
@Nullable Object value) {
}
}).build();
connection.execute(request);
break;
}
}
private String getCharacteristicType(BluetoothGattCharacteristic characteristic) {
StringBuilder sb = new StringBuilder();
int[] properties = new int[]{BluetoothGattCharacteristic.PROPERTY_WRITE,
BluetoothGattCharacteristic.PROPERTY_INDICATE,
BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PROPERTY_READ,
BluetoothGattCharacteristic.PROPERTY_SIGNED_WRITE,
BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE};
String[] propertyStrs = new String[]{"WRITE", "INDICATE", "NOTIFY", "READ", "SIGNED_WRITE", "WRITE_NO_RESPONSE"};
for (int i = 0; i < properties.length; i++) {
int property = properties[i];
if ((characteristic.getProperties() & property) != 0) {
if (sb.length() != 0) {
sb.append(", ");
}
sb.append(propertyStrs[i]);
}
}
return sb.toString();
}
private void setNotification(boolean isEnabled) {
RequestBuilder<NotificationChangeCallback> builder =
new RequestBuilderFactory().getSetNotificationBuilder(ConstantUtil.uuid_service,
ConstantUtil.uuid_notify, !isEnabled);
builder.build().execute(bleManagers.getConnection());
}
@Observe
@Override
public void onNotificationChanged(@NonNull Request request, boolean isEnabled) {
if (request.getType() == RequestType.SET_NOTIFICATION) {
if (isEnabled) {
Log.e("onNotificationChanged", "------通知开启了-----");
bleManagers.startBleService();
finish();
} else {
Log.e("onNotificationChanged", "------通知关闭了-----");
}
} else {
if (isEnabled) {
bleManagers.startBleService();
finish();
} else {
Log.e("onNotificationChanged", "------Indication关闭了-----");
}
}
}
}
package com.phlx.anchorcollect.ble;
import android.app.ActivityManager;
import android.bluetooth.BluetoothGattCharacteristic;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import androidx.annotation.NonNull;
import com.phlx.anchorcollect.event.EventKey;
import com.phlx.anchorcollect.event.EventMsg;
import com.phlx.anchorcollect.event.EventUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import cn.wandersnail.ble.Connection;
import cn.wandersnail.ble.ConnectionConfiguration;
import cn.wandersnail.ble.Device;
import cn.wandersnail.ble.EasyBLE;
import cn.wandersnail.ble.RequestBuilder;
import cn.wandersnail.ble.RequestBuilderFactory;
import cn.wandersnail.ble.WriteCharacteristicBuilder;
import cn.wandersnail.ble.WriteOptions;
import cn.wandersnail.ble.callback.ReadCharacteristicCallback;
import cn.wandersnail.ble.callback.ScanListener;
/**
* <pre>
* author : lei
* e-mail : 18600395998@163.com
* time : 2019/09/03
* desc :
* version: 1.0
* </pre>
*/
public class BleManagers {
private Context mContext;
private static BleManagers bleManagers;
private Intent bleService;//蓝牙服务声明
public Connection getConnection() {
return connection;
}
private Connection connection;
private Map<String, String> devicesNameMap;
/**
* 从给定的上下文中获取btUtils
*
* @param context context
* @return btUtils的一个实例
*/
public static BleManagers from(Context context) {
if (bleManagers == null) {
synchronized (BleManagers.class) {
if (bleManagers == null)
bleManagers = new BleManagers(context);
}
}
return bleManagers;
}
/**
* 唯一的构造函数
*
* @param context context
*/
private BleManagers(Context context) {
mContext = context.getApplicationContext();
bleService = new Intent(context, BleService.class);
}
/**
* 搜索设备
*
* @param listener 监听接口
*/
public void searchBleDevices(OnBleSearchListener listener) {
//扫描前,先停止上一次扫描
cancelBLESearch();
EasyBLE.getInstance().addScanListener(new ScanListener() {
@Override
public void onScanStart() {
if (devicesNameMap == null)
devicesNameMap = new HashMap<>();
devicesNameMap.clear();
listener.onStartDiscovery();
}
@Override
public void onScanStop() {
//搜索停止
// listener.onStartDiscovery();
}
@Override
public void onScanResult(@NonNull Device device, boolean isConnectedBySys) {
if (!devicesNameMap.containsKey(device.getAddress())) {
devicesNameMap.put(device.getAddress(), device.getName());
listener.onBleDeviceFound(device);
}
}
@Override
public void onScanError(int errorCode, @NonNull String errorMsg) {
switch (errorCode) {
case ScanListener.ERROR_LACK_LOCATION_PERMISSION://缺少定位权限
listener.onBleError("缺少定位权限");
break;
case ScanListener.ERROR_LOCATION_SERVICE_CLOSED://位置服务未开启
listener.onBleError("位置服务未开启");
break;
case ScanListener.ERROR_SCAN_FAILED://搜索失败
listener.onBleError("搜索失败");
break;
}
}
});
EasyBLE.getInstance().startScan();
}
/**
* 取消搜索设备
*/
public void cancelBLESearch() {
if (EasyBLE.getInstance().isInitialized()) {
EasyBLE.getInstance().stopScan();
}
}
/**
* 连接蓝牙
*/
public void connectBleDevice(Device device) {
//连接配置,举个例随意配置两项
ConnectionConfiguration config = new ConnectionConfiguration();
config.setConnectTimeoutMillis(10000);
config.setRequestTimeoutMillis(1000);
config.setTryReconnectMaxTimes(0);
config.setAutoReconnect(false);
//观察者监听连接状态
connection = EasyBLE.getInstance().connect(device, config);
}
/**
* 断开一连接的蓝牙设备
*/
public void disConnectBLE(Device device) {
if (device != null && connection != null) {
EasyBLE.getInstance().disconnectConnection(device);//断开指定连接
connection = null;
}
//关闭蓝牙服务
stopBleService();
//清空已存设备地址列表
devicesNameMap.clear();
}
public void writeCharacteristic(UUID uuid_service, UUID uuid_write, byte[] bytes) {
WriteCharacteristicBuilder builder =
new RequestBuilderFactory().getWriteCharacteristicBuilder(uuid_service,
uuid_write, bytes);
//根据需要设置写入配置
builder.setWriteOptions(new WriteOptions.Builder()
.setPackageSize(20)
.setPackageWriteDelayMillis(5)
.setRequestWriteDelayMillis(10)
.setWaitWriteResult(true)
.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT)
.build());
//不设置回调,使用观察者模式接收结果
builder.build().execute(connection);
}
public void readCharacteristic(UUID uuid_service, UUID uuid_read) {
RequestBuilder<ReadCharacteristicCallback> builder =
new RequestBuilderFactory().getReadCharacteristicBuilder(uuid_service, uuid_read);
builder.setTag(UUID.randomUUID().toString());
builder.setPriority(Integer.MAX_VALUE);//设置请求优先级
builder.build().execute(connection);
}
public void startBleService() {
if (!isServiceRunning(mContext)) {
mContext.startService(bleService);
} else {
EventUtils.post(new EventMsg(EventKey.KEY_BLUETOOTH_CONNECT_SUCCESS));
}
}
public void resetBleService() {
if (!isServiceRunning(mContext)) {
mContext.startService(bleService);
}
}
public void stopBleService() {
if (isServiceRunning(mContext)) {
mContext.stopService(bleService);
}
}
/**
* 判断服务是否在运行中
*
* @param context 即为Context对象
* @return 是否在运行中
*/
private boolean isServiceRunning(Context context) {
if (context != null) {
ActivityManager activityManager
= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ArrayList<ActivityManager.RunningServiceInfo> runningServiceInfoList
=
(ArrayList<ActivityManager.RunningServiceInfo>) activityManager.getRunningServices(100);
for (ActivityManager.RunningServiceInfo runningServiceInfo : runningServiceInfoList) {
if ("BleService".equals(runningServiceInfo.service.getClassName())) {
return true;
}
}
} else {
return false;
}
return false;
}
}
package com.phlx.anchorcollect.ble;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.NonNull;
import com.phlx.anchorcollect.App;
import com.phlx.anchorcollect.event.EventKey;
import com.phlx.anchorcollect.event.EventMsg;
import com.phlx.anchorcollect.event.EventUtils;
import com.uhf.structures.OnBluetoothListener;
import java.util.UUID;
import cn.wandersnail.ble.ConnectionState;
import cn.wandersnail.ble.Device;
import cn.wandersnail.ble.EasyBLE;
import cn.wandersnail.ble.EventObserver;
import cn.wandersnail.ble.Request;
import cn.wandersnail.commons.observer.Observe;
import cn.wandersnail.commons.poster.RunOn;
import cn.wandersnail.commons.poster.Tag;
import cn.wandersnail.commons.poster.ThreadMode;
/**
* <pre>
* author : lei
* e-mail : 18600395998@163.com
* time : 2019/04/12
* desc : 蓝牙接收数据服务
* version: 1.0
* </pre>
*/
public class BleService extends Service implements EventObserver {
private static final String TAG = BleService.class.getSimpleName();
private BleManagers bleManagers;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
EasyBLE.getInstance().registerObserver(this);
bleManagers = BleManagers.from(this);
EventUtils.post(new EventMsg(EventKey.KEY_BLUETOOTH_CONNECT_SUCCESS));
Log.e(TAG, "onStartCommand: "+"服务开启了" );
return START_STICKY;
}
@Tag("onCharacteristicChanged")
@RunOn(ThreadMode.BACKGROUND)
@Observe
@Override
public void onCharacteristicChanged(Device device, UUID service, UUID characteristic, byte[] value) {
// App.getInstance().getLinkage().pushRemoteRFIDData(value);
Log.e("Data:notify", value.length + "<--" + bytesToHexString(value, value.length));
}
/**
* 连接状态 监听
*
* @param device
*/
@Tag("onConnectionStateChanged")
@Observe
@RunOn(ThreadMode.MAIN)
@Override
public void onConnectionStateChanged(@NonNull Device device) {
if (device.getConnectionState() == ConnectionState.DISCONNECTED) {
EventUtils.post(new EventMsg(EventKey.KEY_BLUETOOTH_CONNECT_FAILED));
EventUtils.post(new EventMsg<>(EventKey.KEY_INVENTORY_STOP));
}
}
/**
* 写入状态监听
*
* @param request
* @param value
*/
@Tag("onCharacteristicWrite")
@RunOn(ThreadMode.BACKGROUND)
@Observe
@Override
public void onCharacteristicWrite(@NonNull Request request, @NonNull byte[] value) {
Log.e("写入状态监听-", "成功写入:" + cn.wandersnail.commons.util.StringUtils.toHex(value, " "));
// if (uuid_read != null && uuid_notify == null) {
// bleManagers.readCharacteristic(uuid_service, uuid_read);
// }
}
@Override
public void onCharacteristicRead(@NonNull Request request, @NonNull byte[] value) {
if (value.length > 0) {
App.getInstance().getLinkage().pushRemoteRFIDData(value);
// Log.e("Data:read", value.length + "<--" + bytesToHexString(value, value.length));
}
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: "+"服务挂掉了" );
EasyBLE.getInstance().unregisterObserver(this);
}
public static String bytesToHexString(byte src[], int length) {
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0 || length <= 0)
return null;
for (int i = 0; i < length && i < src.length; i++) {
int v = src[i] & 0xff;
String hv = Integer.toHexString(v);
if (hv.length() < 2)
stringBuilder.append(0);
stringBuilder.append(hv + " ");
}
return stringBuilder.toString().toUpperCase();
}
}
\ No newline at end of file
package com.phlx.anchorcollect.ble;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.os.Parcel;
import android.os.Parcelable;
import cn.wandersnail.ble.Device;
public class BluetoothEntity implements Parcelable {
private String name;
private String address;
private int rssi;
private int bondState;
private Device device;
private BluetoothDevice bluetoothDevice;
public BluetoothEntity() {
}
protected BluetoothEntity(Parcel in) {
name = in.readString();
address = in.readString();
rssi = in.readInt();
bondState = in.readInt();
device = in.readParcelable(Device.class.getClassLoader());
bluetoothDevice = in.readParcelable(BluetoothDevice.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(address);
dest.writeInt(rssi);
dest.writeInt(bondState);
dest.writeParcelable(device, flags);
dest.writeParcelable(bluetoothDevice, flags);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<BluetoothEntity> CREATOR = new Creator<BluetoothEntity>() {
@Override
public BluetoothEntity createFromParcel(Parcel in) {
return new BluetoothEntity(in);
}
@Override
public BluetoothEntity[] newArray(int size) {
return new BluetoothEntity[size];
}
};
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getRssi() {
return rssi;
}
public void setRssi(int rssi) {
this.rssi = rssi;
}
public int getBondState() {
return bondState;
}
public void setBondState(int bondState) {
this.bondState = bondState;
}
public Device getDevice() {
return device;
}
public void setDevice(Device device) {
this.device = device;
}
public BluetoothDevice getBluetoothDevice() {
return bluetoothDevice;
}
public void setBluetoothDevice(BluetoothDevice bluetoothDevice) {
this.bluetoothDevice = bluetoothDevice;
}
@Override
public String toString() {
return "BluetoothEntity{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", rssi=" + rssi +
", bondState=" + bondState +
", device=" + device +
", bluetoothDevice=" + bluetoothDevice +
'}';
}
}
package com.phlx.anchorcollect.ble;
import cn.wandersnail.ble.Device;
public interface OnBleSearchListener {
/**
* 在搜索设备之前回调
*/
void onStartDiscovery();
/**
* 搜索到新设备
*
* @param device 新设备
*/
void onBleDeviceFound(Device device);
void onBleError(String e);
}
package com.phlx.anchorcollect.bt;
import android.app.Service;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.phlx.anchorcollect.ble.BleService;
import com.phlx.anchorcollect.event.EventKey;
import com.phlx.anchorcollect.event.EventMsg;
import com.phlx.anchorcollect.event.EventUtils;
import cn.wandersnail.bluetooth.BTManager;
import cn.wandersnail.bluetooth.ConnectCallback;
import cn.wandersnail.bluetooth.Connection;
import cn.wandersnail.bluetooth.EventObserver;
public class BtService extends Service implements EventObserver {
private static final String TAG = BtService.class.getSimpleName();
private Connection connection;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
BTManager.getInstance().registerObserver(this);
Log.e(TAG, "onStartCommand: " + "服务开启了");
BluetoothDevice device = intent.getParcelableExtra("device");
connection = BTManager.getInstance().createConnection(device, this);//观察者监听连接状态
//如果传null,默认使用{@link #SPP_UUID}连接
connection.connect(null, new ConnectCallback() {
@Override
public void onSuccess() {
Log.e(TAG, "connection.connect: " + "onSuccess");
}
@Override
public void onFail(@NonNull String errMsg, @Nullable Throwable e) {
Log.e(TAG, "connection.connect: " + "onFail--" + errMsg);
}
});
return START_STICKY;
}
@Override
public void onRead(@NonNull BluetoothDevice device, @NonNull byte[] value) {
Log.e(TAG, "onRead: " + new String(value));
}
@Override
public void onDestroy() {
super.onDestroy();
BTManager.getInstance().unregisterObserver(this);
}
}
package com.phlx.anchorcollect.data;
import com.phlx.anchorcollect.data.http.ApiService;
import com.phlx.anchorcollect.data.http.HttpDataSource;
import com.phlx.anchorcollect.data.http.HttpDataSourceImpl;
import com.phlx.anchorcollect.data.local.LocalDataSource;
import com.phlx.anchorcollect.data.local.LocalDataSourceImpl;
import com.phlx.anchorcollect.net.RetrofitClient;
/**
* 注入全局的数据仓库,可以考虑使用Dagger2。(根据项目实际情况搭建,千万不要为了架构而架构)
* Created by goldze on 2019/3/26.
*/
public class Injection {
public static Repository provideRepository() {
//网络API服务
ApiService apiService = RetrofitClient.getInstance().create(ApiService.class);
//网络数据源
HttpDataSource httpDataSource = HttpDataSourceImpl.getInstance(apiService);
//本地数据源
LocalDataSource localDataSource = LocalDataSourceImpl.getInstance();
//两条分支组成一个数据仓库
return Repository.getInstance(httpDataSource, localDataSource);
}
public static void destroyRepository() {
Repository.destroyInstance();
LocalDataSourceImpl.destroyInstance();
HttpDataSourceImpl.destroyInstance();
RetrofitClient.destroyInstance();
}
}
package com.phlx.anchorcollect.data;
import androidx.annotation.NonNull;
import com.phlx.anchorcollect.data.http.HttpDataSource;
import com.phlx.anchorcollect.data.local.LocalDataSource;
import com.phlx.anchorcollect.entity.GenData;
import com.phlx.anchorcollect.entity.LoginData;
import com.phlx.anchorcollect.params.CollectResponse;
import java.util.Map;
import io.reactivex.Observable;
import me.goldze.mvvmhabit.base.BaseModel;
import retrofit2.http.FieldMap;
/**
*
*/
public class Repository extends BaseModel implements HttpDataSource, LocalDataSource {
private volatile static Repository INSTANCE = null;
private final HttpDataSource mHttpDataSource;
private final LocalDataSource mLocalDataSource;
private Repository(@NonNull HttpDataSource httpDataSource,
@NonNull LocalDataSource localDataSource) {
this.mHttpDataSource = httpDataSource;
this.mLocalDataSource = localDataSource;
}
public static Repository getInstance(HttpDataSource httpDataSource,
LocalDataSource localDataSource) {
if (INSTANCE == null) {
synchronized (Repository.class) {
if (INSTANCE == null) {
INSTANCE = new Repository(httpDataSource, localDataSource);
}
}
}
return INSTANCE;
}
public static void destroyInstance() {
INSTANCE = null;
}
@Override
public Observable<CollectResponse<LoginData>> loginPost(@FieldMap Map<String,String> map) {
return mHttpDataSource.loginPost(map);
}
@Override
public Observable<CollectResponse<GenData>> genGet() {
return mHttpDataSource.genGet();
}
/****************************************************************************/
@Override
public void saveUserName(String userName) {
mLocalDataSource.saveUserName(userName);
}
@Override
public void savePassword(String password) {
mLocalDataSource.savePassword(password);
}
@Override
public void savePhone(String phone) {
mLocalDataSource.savePhone(phone);
}
@Override
public void saveEmail(String email) {
mLocalDataSource.saveEmail(email);
}
@Override
public void saveFrequencyConfig(String frequencyConfig) {
mLocalDataSource.saveFrequencyConfig(frequencyConfig);
}
@Override
public void saveToken(String token) {
mLocalDataSource.saveToken(token);
}
@Override
public String getUserName() {
return mLocalDataSource.getUserName();
}
@Override
public String getPassword() {
return mLocalDataSource.getPassword();
}
@Override
public String getPhone() {
return mLocalDataSource.getPhone();
}
@Override
public String getEmail() {
return mLocalDataSource.getEmail();
}
@Override
public String getFrequencyConfig() {
return mLocalDataSource.getFrequencyConfig();
}
@Override
public String getToken() {
return mLocalDataSource.getToken();
}
}
package com.phlx.anchorcollect.data;
import android.annotation.SuppressLint;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.phlx.anchorcollect.ui.fragment.vm.BasicsCollectVM;
import com.phlx.anchorcollect.ui.fragment.vm.CollectListVM;
import com.phlx.anchorcollect.ui.fragment.vm.CollectVM;
import com.phlx.anchorcollect.ui.home.HomeVM;
import com.phlx.anchorcollect.ui.info.CattleVM;
import com.phlx.anchorcollect.ui.login.LoginVM;
import com.phlx.anchorcollect.ui.main.MainVM;
import com.phlx.anchorcollect.ui.setting.BtSettingVM;
import com.phlx.anchorcollect.ui.splash.SplashVM;
/**
*
*/
public class VMFactory extends ViewModelProvider.NewInstanceFactory {
@SuppressLint("StaticFieldLeak")
private static volatile VMFactory INSTANCE;
private final Application mApplication;
private Repository repository;
public static VMFactory getInstance(Application application) {
if (INSTANCE == null) {
synchronized (VMFactory.class) {
if (INSTANCE == null) {
INSTANCE = new VMFactory(application, Injection.provideRepository());
}
}
}
return INSTANCE;
}
public void refreshRepository() {
if (repository != null) {
repository = null;
Injection.destroyRepository();
repository = Injection.provideRepository();
}
}
@VisibleForTesting
public static void destroyInstance() {
INSTANCE = null;
}
private VMFactory(Application application, Repository repository) {
this.mApplication = application;
this.repository = repository;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass.isAssignableFrom(SplashVM.class)) {
return (T) new SplashVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(LoginVM.class)) {
return (T) new LoginVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(HomeVM.class)) {
return (T) new HomeVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(MainVM.class)) {
return (T) new MainVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(BasicsCollectVM.class)) {
return (T) new BasicsCollectVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(CollectVM.class)) {
return (T) new CollectVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(CollectListVM.class)) {
return (T) new CollectListVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(CattleVM.class)) {
return (T) new CattleVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(BtSettingVM.class)) {
return (T) new BtSettingVM(mApplication, repository);
}
throw new IllegalArgumentException("Unknown ViewModel class: " + modelClass.getName());
}
}
package com.phlx.anchorcollect.data.http;
import com.phlx.anchorcollect.entity.GenData;
import com.phlx.anchorcollect.entity.LoginData;
import com.phlx.anchorcollect.params.CollectResponse;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
/**
* Created by goldze on 2017/6/15.
*/
public interface ApiService {
// /**
// * 获取版本号
// */
// @GET("/app/getAppVsesion?type=2")
// Observable<CattleResponse<Double>> versionGet();
//
// /**
// * 下载新版本
// */
// @GET("/app/download")
// Observable<CattleResponse> DownloadApp();
// @Headers({"Content-Type: application/json", "Accept: application/json"})
/**
* 登录
*/
@FormUrlEncoded
@POST("/jwt/login")
Observable<CollectResponse<LoginData>> loginPost(@FieldMap Map<String,String> map);
/**
* 获取页面配置
*/
@GET("/api/gen/list")
Observable<CollectResponse<GenData>> genGet();
}
package com.phlx.anchorcollect.data.http;
import com.phlx.anchorcollect.entity.GenData;
import com.phlx.anchorcollect.entity.LoginData;
import com.phlx.anchorcollect.params.CollectResponse;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.FieldMap;
/**
* Created by goldze on 2019/3/26.
*/
public interface HttpDataSource {
// /**
// * 获取版本号
// */
// Observable<CattleResponse<Double>> versionGet();
//
// /**
// * 下载新版本
// */
// Observable<CattleResponse> DownloadApp();
/**
* 登录
*/
Observable<CollectResponse<LoginData>> loginPost(@FieldMap Map<String,String> map);
/**
* 获取页面配置
*/
Observable<CollectResponse<GenData>> genGet();
}
package com.phlx.anchorcollect.data.http;
import com.phlx.anchorcollect.entity.GenData;
import com.phlx.anchorcollect.entity.LoginData;
import com.phlx.anchorcollect.params.CollectResponse;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.FieldMap;
/**
* Created by goldze on 2019/3/26.
*/
public class HttpDataSourceImpl implements HttpDataSource {
private ApiService apiService;
private volatile static HttpDataSourceImpl INSTANCE = null;
public static HttpDataSourceImpl getInstance(ApiService apiService) {
if (INSTANCE == null) {
synchronized (HttpDataSourceImpl.class) {
if (INSTANCE == null) {
INSTANCE = new HttpDataSourceImpl(apiService);
}
}
}
return INSTANCE;
}
public static void destroyInstance() {
INSTANCE = null;
}
private HttpDataSourceImpl(ApiService apiService) {
this.apiService = apiService;
}
@Override
public Observable<CollectResponse<LoginData>> loginPost(@FieldMap Map<String,String> map) {
return apiService.loginPost(map);
}
@Override
public Observable<CollectResponse<GenData>> genGet() {
return apiService.genGet();
}
}
package com.phlx.anchorcollect.data.local;
import java.util.List;
/**
* Created by goldze on 2019/3/26.
*/
public interface LocalDataSource {
/**
* 保存用户名
*/
void saveUserName(String userName);
/**
* 保存用户密码
*/
void savePassword(String password);
/**
* 保存电话
*/
void savePhone(String phone);
/**
* 保存Email
*/
void saveEmail(String email);
/**
* 保存频率类型,0高频,1低频
*/
void saveFrequencyConfig(String frequencyConfig);
/**
* 保存Token
*/
void saveToken(String token);
/**
* 获取用户名
*/
String getUserName();
/**
* 获取用户密码
*/
String getPassword();
/**
* 获取用户电话
*/
String getPhone();
/**
* 获取用户邮箱
*/
String getEmail();
/**
* 获取用户频率类型
*/
String getFrequencyConfig();
/**
* 获取Token
*/
String getToken();
}
package com.phlx.anchorcollect.data.local;
import com.phlx.anchorcollect.Configs;
import me.goldze.mvvmhabit.utils.SPUtils;
public class LocalDataSourceImpl implements LocalDataSource {
private volatile static LocalDataSourceImpl INSTANCE = null;
public static LocalDataSourceImpl getInstance() {
if (INSTANCE == null) {
synchronized (LocalDataSourceImpl.class) {
if (INSTANCE == null) {
INSTANCE = new LocalDataSourceImpl();
}
}
}
return INSTANCE;
}
public static void destroyInstance() {
INSTANCE = null;
}
@Override
public void saveUserName(String userName) {
SPUtils.getInstance().put(Configs.SP_USER_NAME, userName);
}
@Override
public void savePassword(String password) {
SPUtils.getInstance().put(Configs.SP_USER_PASSWORD, password);
}
@Override
public void savePhone(String phone) {
SPUtils.getInstance().put(Configs.SP_USER_PHONE, phone);
}
@Override
public void saveEmail(String email) {
SPUtils.getInstance().put(Configs.SP_USER_EMAIL, email);
}
@Override
public void saveFrequencyConfig(String frequencyConfig) {
SPUtils.getInstance().put(Configs.SP_FREQUENCY_CONFIG, frequencyConfig);
}
@Override
public void saveToken(String token) {
SPUtils.getInstance().put("token", token);
}
@Override
public String getUserName() {
return SPUtils.getInstance().getString(Configs.SP_USER_NAME, "");
}
@Override
public String getPassword() {
return SPUtils.getInstance().getString(Configs.SP_USER_PASSWORD, "");
}
@Override
public String getPhone() {
return null;
}
@Override
public String getEmail() {
return null;
}
@Override
public String getFrequencyConfig() {
return null;
}
@Override
public String getToken() {
return SPUtils.getInstance().getString("token", "");
}
}
This diff is collapsed.
package com.phlx.anchorcollect.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.github.yuweiguocn.library.greendao.MigrationHelper;
import com.phlx.anchorcollect.db.gen.CardEntityDao;
import com.phlx.anchorcollect.db.gen.DaoMaster;
import com.phlx.anchorcollect.entity.CardEntity;
import org.greenrobot.greendao.database.Database;
public class MyOpenHelper extends DaoMaster.DevOpenHelper {
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
//把需要管理的数据库表DAO作为最后一个参数传入到方法中
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, ifExists);
}
},
CardEntityDao.class
// DivisionEntityDao.class, HarmlessDao.class, HarmlessDetailDao.class, LabelDao.class
// , MarkingDao.class, QuarantineDao.class, QuarantineDetailDao.class
// , TreatmentMethodDao.class, UnitDao.class, VarietyDao.class, VeterinaryDao.class
// , VillusBuyEntityDao.class, VillusGaugeEntityDao.class, EntryRegistrationEntityDao.class, CacheLabelDao.class
);
}
}
package com.phlx.anchorcollect.db.gen;
import android.database.Cursor;
import android.database.sqlite.SQLiteStatement;
import org.greenrobot.greendao.AbstractDao;
import org.greenrobot.greendao.Property;
import org.greenrobot.greendao.internal.DaoConfig;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.database.DatabaseStatement;
import com.phlx.anchorcollect.entity.AncestryinfoEntity;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* DAO for table "ANCESTRYINFO_ENTITY".
*/
public class AncestryinfoEntityDao extends AbstractDao<AncestryinfoEntity, Long> {
public static final String TABLENAME = "ANCESTRYINFO_ENTITY";
/**
* Properties of entity AncestryinfoEntity.<br/>
* Can be used for QueryBuilder and for referencing column names.
*/
public static class Properties {
public final static Property Id = new Property(0, Long.class, "id", true, "_id");
public final static Property Ancestryid = new Property(1, String.class, "ancestryid", false, "ANCESTRYID");
public final static Property Ancestryname = new Property(2, String.class, "ancestryname", false, "ANCESTRYNAME");
public final static Property Remark = new Property(3, String.class, "remark", false, "REMARK");
public final static Property Timestamp = new Property(4, long.class, "timestamp", false, "TIMESTAMP");
}
public AncestryinfoEntityDao(DaoConfig config) {
super(config);
}
public AncestryinfoEntityDao(DaoConfig config, DaoSession daoSession) {
super(config, daoSession);
}
/** Creates the underlying database table. */
public static void createTable(Database db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "\"ANCESTRYINFO_ENTITY\" (" + //
"\"_id\" INTEGER PRIMARY KEY ," + // 0: id
"\"ANCESTRYID\" TEXT," + // 1: ancestryid
"\"ANCESTRYNAME\" TEXT," + // 2: ancestryname
"\"REMARK\" TEXT," + // 3: remark
"\"TIMESTAMP\" INTEGER NOT NULL );"); // 4: timestamp
// Add Indexes
db.execSQL("CREATE INDEX " + constraint + "ancestryTime ON \"ANCESTRYINFO_ENTITY\"" +
" (\"TIMESTAMP\" ASC);");
}
/** Drops the underlying database table. */
public static void dropTable(Database db, boolean ifExists) {
String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"ANCESTRYINFO_ENTITY\"";
db.execSQL(sql);
}
@Override
protected final void bindValues(DatabaseStatement stmt, AncestryinfoEntity entity) {
stmt.clearBindings();
Long id = entity.getId();
if (id != null) {
stmt.bindLong(1, id);
}
String ancestryid = entity.getAncestryid();
if (ancestryid != null) {
stmt.bindString(2, ancestryid);
}
String ancestryname = entity.getAncestryname();
if (ancestryname != null) {
stmt.bindString(3, ancestryname);
}
String remark = entity.getRemark();
if (remark != null) {
stmt.bindString(4, remark);
}
stmt.bindLong(5, entity.getTimestamp());
}
@Override
protected final void bindValues(SQLiteStatement stmt, AncestryinfoEntity entity) {
stmt.clearBindings();
Long id = entity.getId();
if (id != null) {
stmt.bindLong(1, id);
}
String ancestryid = entity.getAncestryid();
if (ancestryid != null) {
stmt.bindString(2, ancestryid);
}
String ancestryname = entity.getAncestryname();
if (ancestryname != null) {
stmt.bindString(3, ancestryname);
}
String remark = entity.getRemark();
if (remark != null) {
stmt.bindString(4, remark);
}
stmt.bindLong(5, entity.getTimestamp());
}
@Override
public Long readKey(Cursor cursor, int offset) {
return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
}
@Override
public AncestryinfoEntity readEntity(Cursor cursor, int offset) {
AncestryinfoEntity entity = new AncestryinfoEntity( //
cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // ancestryid
cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // ancestryname
cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // remark
cursor.getLong(offset + 4) // timestamp
);
return entity;
}
@Override
public void readEntity(Cursor cursor, AncestryinfoEntity entity, int offset) {
entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
entity.setAncestryid(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
entity.setAncestryname(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
entity.setRemark(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
entity.setTimestamp(cursor.getLong(offset + 4));
}
@Override
protected final Long updateKeyAfterInsert(AncestryinfoEntity entity, long rowId) {
entity.setId(rowId);
return rowId;
}
@Override
public Long getKey(AncestryinfoEntity entity) {
if(entity != null) {
return entity.getId();
} else {
return null;
}
}
@Override
public boolean hasKey(AncestryinfoEntity entity) {
return entity.getId() != null;
}
@Override
protected final boolean isEntityUpdateable() {
return true;
}
}
package com.phlx.anchorcollect.db.gen;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
import org.greenrobot.greendao.AbstractDaoMaster;
import org.greenrobot.greendao.database.StandardDatabase;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.database.DatabaseOpenHelper;
import org.greenrobot.greendao.identityscope.IdentityScopeType;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* Master of DAO (schema version 1): knows all DAOs.
*/
public class DaoMaster extends AbstractDaoMaster {
public static final int SCHEMA_VERSION = 1;
/** Creates underlying database table using DAOs. */
public static void createAllTables(Database db, boolean ifNotExists) {
AncestryinfoEntityDao.createTable(db, ifNotExists);
CardEntityDao.createTable(db, ifNotExists);
CattleResumeEntityDao.createTable(db, ifNotExists);
GenTableDao.createTable(db, ifNotExists);
GenTableColumnDao.createTable(db, ifNotExists);
ImmuneEntityDao.createTable(db, ifNotExists);
MedicalEntityDao.createTable(db, ifNotExists);
PerformanceEntityDao.createTable(db, ifNotExists);
UserRoleEntityDao.createTable(db, ifNotExists);
WeightingEntityDao.createTable(db, ifNotExists);
}
/** Drops underlying database table using DAOs. */
public static void dropAllTables(Database db, boolean ifExists) {
AncestryinfoEntityDao.dropTable(db, ifExists);
CardEntityDao.dropTable(db, ifExists);
CattleResumeEntityDao.dropTable(db, ifExists);
GenTableDao.dropTable(db, ifExists);
GenTableColumnDao.dropTable(db, ifExists);
ImmuneEntityDao.dropTable(db, ifExists);
MedicalEntityDao.dropTable(db, ifExists);
PerformanceEntityDao.dropTable(db, ifExists);
UserRoleEntityDao.dropTable(db, ifExists);
WeightingEntityDao.dropTable(db, ifExists);
}
/**
* WARNING: Drops all table on Upgrade! Use only during development.
* Convenience method using a {@link DevOpenHelper}.
*/
public static DaoSession newDevSession(Context context, String name) {
Database db = new DevOpenHelper(context, name).getWritableDb();
DaoMaster daoMaster = new DaoMaster(db);
return daoMaster.newSession();
}
public DaoMaster(SQLiteDatabase db) {
this(new StandardDatabase(db));
}
public DaoMaster(Database db) {
super(db, SCHEMA_VERSION);
registerDaoClass(AncestryinfoEntityDao.class);
registerDaoClass(CardEntityDao.class);
registerDaoClass(CattleResumeEntityDao.class);
registerDaoClass(GenTableDao.class);
registerDaoClass(GenTableColumnDao.class);
registerDaoClass(ImmuneEntityDao.class);
registerDaoClass(MedicalEntityDao.class);
registerDaoClass(PerformanceEntityDao.class);
registerDaoClass(UserRoleEntityDao.class);
registerDaoClass(WeightingEntityDao.class);
}
public DaoSession newSession() {
return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
}
public DaoSession newSession(IdentityScopeType type) {
return new DaoSession(db, type, daoConfigMap);
}
/**
* Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} -
*/
public static abstract class OpenHelper extends DatabaseOpenHelper {
public OpenHelper(Context context, String name) {
super(context, name, SCHEMA_VERSION);
}
public OpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory, SCHEMA_VERSION);
}
@Override
public void onCreate(Database db) {
Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
createAllTables(db, false);
}
}
/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name) {
super(context, name);
}
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
}
}
package com.phlx.anchorcollect.db.gen;
import java.util.Map;
import org.greenrobot.greendao.AbstractDao;
import org.greenrobot.greendao.AbstractDaoSession;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.identityscope.IdentityScopeType;
import org.greenrobot.greendao.internal.DaoConfig;
import com.phlx.anchorcollect.entity.AncestryinfoEntity;
import com.phlx.anchorcollect.entity.CardEntity;
import com.phlx.anchorcollect.entity.CattleResumeEntity;
import com.phlx.anchorcollect.entity.GenTable;
import com.phlx.anchorcollect.entity.GenTableColumn;
import com.phlx.anchorcollect.entity.ImmuneEntity;
import com.phlx.anchorcollect.entity.MedicalEntity;
import com.phlx.anchorcollect.entity.PerformanceEntity;
import com.phlx.anchorcollect.entity.UserRoleEntity;
import com.phlx.anchorcollect.entity.WeightingEntity;
import com.phlx.anchorcollect.db.gen.AncestryinfoEntityDao;
import com.phlx.anchorcollect.db.gen.CardEntityDao;
import com.phlx.anchorcollect.db.gen.CattleResumeEntityDao;
import com.phlx.anchorcollect.db.gen.GenTableDao;
import com.phlx.anchorcollect.db.gen.GenTableColumnDao;
import com.phlx.anchorcollect.db.gen.ImmuneEntityDao;
import com.phlx.anchorcollect.db.gen.MedicalEntityDao;
import com.phlx.anchorcollect.db.gen.PerformanceEntityDao;
import com.phlx.anchorcollect.db.gen.UserRoleEntityDao;
import com.phlx.anchorcollect.db.gen.WeightingEntityDao;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* {@inheritDoc}
*
* @see org.greenrobot.greendao.AbstractDaoSession
*/
public class DaoSession extends AbstractDaoSession {
private final DaoConfig ancestryinfoEntityDaoConfig;
private final DaoConfig cardEntityDaoConfig;
private final DaoConfig cattleResumeEntityDaoConfig;
private final DaoConfig genTableDaoConfig;
private final DaoConfig genTableColumnDaoConfig;
private final DaoConfig immuneEntityDaoConfig;
private final DaoConfig medicalEntityDaoConfig;
private final DaoConfig performanceEntityDaoConfig;
private final DaoConfig userRoleEntityDaoConfig;
private final DaoConfig weightingEntityDaoConfig;
private final AncestryinfoEntityDao ancestryinfoEntityDao;
private final CardEntityDao cardEntityDao;
private final CattleResumeEntityDao cattleResumeEntityDao;
private final GenTableDao genTableDao;
private final GenTableColumnDao genTableColumnDao;
private final ImmuneEntityDao immuneEntityDao;
private final MedicalEntityDao medicalEntityDao;
private final PerformanceEntityDao performanceEntityDao;
private final UserRoleEntityDao userRoleEntityDao;
private final WeightingEntityDao weightingEntityDao;
public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
daoConfigMap) {
super(db);
ancestryinfoEntityDaoConfig = daoConfigMap.get(AncestryinfoEntityDao.class).clone();
ancestryinfoEntityDaoConfig.initIdentityScope(type);
cardEntityDaoConfig = daoConfigMap.get(CardEntityDao.class).clone();
cardEntityDaoConfig.initIdentityScope(type);
cattleResumeEntityDaoConfig = daoConfigMap.get(CattleResumeEntityDao.class).clone();
cattleResumeEntityDaoConfig.initIdentityScope(type);
genTableDaoConfig = daoConfigMap.get(GenTableDao.class).clone();
genTableDaoConfig.initIdentityScope(type);
genTableColumnDaoConfig = daoConfigMap.get(GenTableColumnDao.class).clone();
genTableColumnDaoConfig.initIdentityScope(type);
immuneEntityDaoConfig = daoConfigMap.get(ImmuneEntityDao.class).clone();
immuneEntityDaoConfig.initIdentityScope(type);
medicalEntityDaoConfig = daoConfigMap.get(MedicalEntityDao.class).clone();
medicalEntityDaoConfig.initIdentityScope(type);
performanceEntityDaoConfig = daoConfigMap.get(PerformanceEntityDao.class).clone();
performanceEntityDaoConfig.initIdentityScope(type);
userRoleEntityDaoConfig = daoConfigMap.get(UserRoleEntityDao.class).clone();
userRoleEntityDaoConfig.initIdentityScope(type);
weightingEntityDaoConfig = daoConfigMap.get(WeightingEntityDao.class).clone();
weightingEntityDaoConfig.initIdentityScope(type);
ancestryinfoEntityDao = new AncestryinfoEntityDao(ancestryinfoEntityDaoConfig, this);
cardEntityDao = new CardEntityDao(cardEntityDaoConfig, this);
cattleResumeEntityDao = new CattleResumeEntityDao(cattleResumeEntityDaoConfig, this);
genTableDao = new GenTableDao(genTableDaoConfig, this);
genTableColumnDao = new GenTableColumnDao(genTableColumnDaoConfig, this);
immuneEntityDao = new ImmuneEntityDao(immuneEntityDaoConfig, this);
medicalEntityDao = new MedicalEntityDao(medicalEntityDaoConfig, this);
performanceEntityDao = new PerformanceEntityDao(performanceEntityDaoConfig, this);
userRoleEntityDao = new UserRoleEntityDao(userRoleEntityDaoConfig, this);
weightingEntityDao = new WeightingEntityDao(weightingEntityDaoConfig, this);
registerDao(AncestryinfoEntity.class, ancestryinfoEntityDao);
registerDao(CardEntity.class, cardEntityDao);
registerDao(CattleResumeEntity.class, cattleResumeEntityDao);
registerDao(GenTable.class, genTableDao);
registerDao(GenTableColumn.class, genTableColumnDao);
registerDao(ImmuneEntity.class, immuneEntityDao);
registerDao(MedicalEntity.class, medicalEntityDao);
registerDao(PerformanceEntity.class, performanceEntityDao);
registerDao(UserRoleEntity.class, userRoleEntityDao);
registerDao(WeightingEntity.class, weightingEntityDao);
}
public void clear() {
ancestryinfoEntityDaoConfig.clearIdentityScope();
cardEntityDaoConfig.clearIdentityScope();
cattleResumeEntityDaoConfig.clearIdentityScope();
genTableDaoConfig.clearIdentityScope();
genTableColumnDaoConfig.clearIdentityScope();
immuneEntityDaoConfig.clearIdentityScope();
medicalEntityDaoConfig.clearIdentityScope();
performanceEntityDaoConfig.clearIdentityScope();
userRoleEntityDaoConfig.clearIdentityScope();
weightingEntityDaoConfig.clearIdentityScope();
}
public AncestryinfoEntityDao getAncestryinfoEntityDao() {
return ancestryinfoEntityDao;
}
public CardEntityDao getCardEntityDao() {
return cardEntityDao;
}
public CattleResumeEntityDao getCattleResumeEntityDao() {
return cattleResumeEntityDao;
}
public GenTableDao getGenTableDao() {
return genTableDao;
}
public GenTableColumnDao getGenTableColumnDao() {
return genTableColumnDao;
}
public ImmuneEntityDao getImmuneEntityDao() {
return immuneEntityDao;
}
public MedicalEntityDao getMedicalEntityDao() {
return medicalEntityDao;
}
public PerformanceEntityDao getPerformanceEntityDao() {
return performanceEntityDao;
}
public UserRoleEntityDao getUserRoleEntityDao() {
return userRoleEntityDao;
}
public WeightingEntityDao getWeightingEntityDao() {
return weightingEntityDao;
}
}
package com.phlx.anchorcollect.db.gen;
import android.database.Cursor;
import android.database.sqlite.SQLiteStatement;
import org.greenrobot.greendao.AbstractDao;
import org.greenrobot.greendao.Property;
import org.greenrobot.greendao.internal.DaoConfig;
import org.greenrobot.greendao.database.Database;
import org.greenrobot.greendao.database.DatabaseStatement;
import com.phlx.anchorcollect.entity.UserRoleEntity;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/**
* DAO for table "USER_ROLE_ENTITY".
*/
public class UserRoleEntityDao extends AbstractDao<UserRoleEntity, Void> {
public static final String TABLENAME = "USER_ROLE_ENTITY";
/**
* Properties of entity UserRoleEntity.<br/>
* Can be used for QueryBuilder and for referencing column names.
*/
public static class Properties {
public final static Property RoleId = new Property(0, String.class, "roleId", false, "ROLE_ID");
public final static Property RoleName = new Property(1, String.class, "roleName", false, "ROLE_NAME");
public final static Property RoleKey = new Property(2, String.class, "roleKey", false, "ROLE_KEY");
public final static Property RoleSort = new Property(3, String.class, "roleSort", false, "ROLE_SORT");
public final static Property DataScope = new Property(4, String.class, "dataScope", false, "DATA_SCOPE");
public final static Property Status = new Property(5, String.class, "status", false, "STATUS");
public final static Property DelFlag = new Property(6, String.class, "delFlag", false, "DEL_FLAG");
public final static Property Flag = new Property(7, boolean.class, "flag", false, "FLAG");
}
public UserRoleEntityDao(DaoConfig config) {
super(config);
}
public UserRoleEntityDao(DaoConfig config, DaoSession daoSession) {
super(config, daoSession);
}
/** Creates the underlying database table. */
public static void createTable(Database db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "\"USER_ROLE_ENTITY\" (" + //
"\"ROLE_ID\" TEXT," + // 0: roleId
"\"ROLE_NAME\" TEXT," + // 1: roleName
"\"ROLE_KEY\" TEXT," + // 2: roleKey
"\"ROLE_SORT\" TEXT," + // 3: roleSort
"\"DATA_SCOPE\" TEXT," + // 4: dataScope
"\"STATUS\" TEXT," + // 5: status
"\"DEL_FLAG\" TEXT," + // 6: delFlag
"\"FLAG\" INTEGER NOT NULL );"); // 7: flag
}
/** Drops the underlying database table. */
public static void dropTable(Database db, boolean ifExists) {
String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"USER_ROLE_ENTITY\"";
db.execSQL(sql);
}
@Override
protected final void bindValues(DatabaseStatement stmt, UserRoleEntity entity) {
stmt.clearBindings();
String roleId = entity.getRoleId();
if (roleId != null) {
stmt.bindString(1, roleId);
}
String roleName = entity.getRoleName();
if (roleName != null) {
stmt.bindString(2, roleName);
}
String roleKey = entity.getRoleKey();
if (roleKey != null) {
stmt.bindString(3, roleKey);
}
String roleSort = entity.getRoleSort();
if (roleSort != null) {
stmt.bindString(4, roleSort);
}
String dataScope = entity.getDataScope();
if (dataScope != null) {
stmt.bindString(5, dataScope);
}
String status = entity.getStatus();
if (status != null) {
stmt.bindString(6, status);
}
String delFlag = entity.getDelFlag();
if (delFlag != null) {
stmt.bindString(7, delFlag);
}
stmt.bindLong(8, entity.getFlag() ? 1L: 0L);
}
@Override
protected final void bindValues(SQLiteStatement stmt, UserRoleEntity entity) {
stmt.clearBindings();
String roleId = entity.getRoleId();
if (roleId != null) {
stmt.bindString(1, roleId);
}
String roleName = entity.getRoleName();
if (roleName != null) {
stmt.bindString(2, roleName);
}
String roleKey = entity.getRoleKey();
if (roleKey != null) {
stmt.bindString(3, roleKey);
}
String roleSort = entity.getRoleSort();
if (roleSort != null) {
stmt.bindString(4, roleSort);
}
String dataScope = entity.getDataScope();
if (dataScope != null) {
stmt.bindString(5, dataScope);
}
String status = entity.getStatus();
if (status != null) {
stmt.bindString(6, status);
}
String delFlag = entity.getDelFlag();
if (delFlag != null) {
stmt.bindString(7, delFlag);
}
stmt.bindLong(8, entity.getFlag() ? 1L: 0L);
}
@Override
public Void readKey(Cursor cursor, int offset) {
return null;
}
@Override
public UserRoleEntity readEntity(Cursor cursor, int offset) {
UserRoleEntity entity = new UserRoleEntity( //
cursor.isNull(offset + 0) ? null : cursor.getString(offset + 0), // roleId
cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // roleName
cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // roleKey
cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // roleSort
cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // dataScope
cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5), // status
cursor.isNull(offset + 6) ? null : cursor.getString(offset + 6), // delFlag
cursor.getShort(offset + 7) != 0 // flag
);
return entity;
}
@Override
public void readEntity(Cursor cursor, UserRoleEntity entity, int offset) {
entity.setRoleId(cursor.isNull(offset + 0) ? null : cursor.getString(offset + 0));
entity.setRoleName(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
entity.setRoleKey(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
entity.setRoleSort(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
entity.setDataScope(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
entity.setStatus(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5));
entity.setDelFlag(cursor.isNull(offset + 6) ? null : cursor.getString(offset + 6));
entity.setFlag(cursor.getShort(offset + 7) != 0);
}
@Override
protected final Void updateKeyAfterInsert(UserRoleEntity entity, long rowId) {
// Unsupported or missing PK type
return null;
}
@Override
public Void getKey(UserRoleEntity entity) {
return null;
}
@Override
public boolean hasKey(UserRoleEntity entity) {
// TODO
return false;
}
@Override
protected final boolean isEntityUpdateable() {
return true;
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment