Commit d96a7aebea9b06b60752b3c20c049eb570f45441

Authored by 张道锋
1 parent 1a085af7

no message

.gitignore
... ... @@ -2,8 +2,11 @@
2 2 .gradle
3 3 /local.properties
4 4 /.idea
  5 +.idea/
5 6 .DS_Store
6 7 /build
7 8 /captures
8 9 .externalNativeBuild
9 10 app/release/app-release.apk
  11 +app/src/main/java/com/shunzhi/parent/DataBaseTestActivity.java
  12 +app/src/main/res/layout/activity_data_base_test.xml
... ...
app/build.gradle
... ... @@ -32,7 +32,7 @@ android {
32 32 productFlavors {
33 33 }
34 34 }
35   -greendao{
  35 +greendao {
36 36 schemaVersion 1//数据库版本升级
37 37 }
38 38 dependencies {
... ...
app/src/main/AndroidManifest.xml
1 1 <?xml version="1.0" encoding="utf-8"?>
2 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3   - package="com.shunzhi.parent">
  3 + package="com.shunzhi.parent">
4 4  
5 5 <!-- 用于进行网络定位 -->
6   - <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  6 + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
7 7 <!-- 用于访问GPS定位 -->
8   - <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
9   - <uses-permission android:name="android.permission.GET_TASKS" />
10   - <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
11   - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  8 + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  9 + <uses-permission android:name="android.permission.GET_TASKS"/>
  10 + <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  11 + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
12 12 <!-- Android 6.0版本可去除,用于选举信息(通道复用)的同步 -->
13   - <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  13 + <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
14 14 <!-- 进行网络访问和网络状态监控相关的权限声明 -->
15   - <uses-permission android:name="android.permission.INTERNET" />
  15 + <uses-permission android:name="android.permission.INTERNET"/>
16 16 <!-- 用于获取运营商信息,用于支持提供运营商信息相关的接口 -->
17   - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  17 + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
18 18 <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
19   - <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  19 + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
20 20 <!-- 用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
21   - <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  21 + <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
22 22 <!-- 允许对sd卡进行读写操作 -->
23   - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  23 + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
24 24 <!-- 用于申请调用A-GPS模块 -->
25   - <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
  25 + <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
26 26 <!-- 网络库使用,当网络操作时需要确保事务完成不被杀掉 -->
27   - <uses-permission android:name="android.permission.WAKE_LOCK" />
  27 + <uses-permission android:name="android.permission.WAKE_LOCK"/>
28 28 <!-- 用于读取手机硬件信息等,用于机型过滤 -->
29   - <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  29 + <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
30 30 <!-- 选举使用,当应用有删除或者更新时需要重新选举,复用推送通道 -->
31   - <uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
32   - <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
33   - <uses-permission android:name="android.permission.RESTART_PACKAGES" />
  31 + <uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED"/>
  32 + <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED"/>
  33 + <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
34 34 <!-- 补偿通道小米PUSH使用,不用可去除 -->
35 35 <!-- <uses-permission android:name="android.permission.GET_TASKS" /> -->
36 36 <!-- 补偿通道GCM使用,不使用可去除 -->
37   - <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  37 + <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
38 38 <!-- 允许监听启动完成事件 -->
39   - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  39 + <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
40 40 <!-- 允许访问震动器 -->
41   - <uses-permission android:name="android.permission.VIBRATE" />
  41 + <uses-permission android:name="android.permission.VIBRATE"/>
42 42 <!-- 允许task重排序 -->
43   - <uses-permission android:name="android.permission.REORDER_TASKS" />
  43 + <uses-permission android:name="android.permission.REORDER_TASKS"/>
44 44 <!-- 用于申请获取蓝牙信息进行室内定位 -->
45   - <uses-permission android:name="android.permission.BLUETOOTH" />
46   - <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  45 + <uses-permission android:name="android.permission.BLUETOOTH"/>
  46 + <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
47 47  
48 48 <!-- 接收 SDK 消息广播权限, 第三方 APP 接入时,请将 com.netease.nim.demo 替换为自己的包名 -->
49   - <uses-permission android:name="com.shunzhi.parent.permission.RECEIVE_MSG" />
50   - <uses-permission android:name="android.permission.CALL_PHONE" />
  49 + <uses-permission android:name="com.shunzhi.parent.permission.RECEIVE_MSG"/>
  50 + <uses-permission android:name="android.permission.CALL_PHONE"/>
51 51  
52 52 <application
53 53 android:name=".AppContext"
... ... @@ -59,7 +59,7 @@
59 59 android:theme="@style/Theme.AppCompat.Light.NoActionBar">
60 60  
61 61 <!-- 高德地图服务 -->
62   - <service android:name="com.amap.api.location.APSService" />
  62 + <service android:name="com.amap.api.location.APSService"/>
63 63 <!-- 高德地图密钥 -->
64 64 <!-- <meta-data -->
65 65 <!-- android:name="com.amap.api.v2.apikey" -->
... ... @@ -67,34 +67,34 @@
67 67  
68 68  
69 69 <!-- 家长慧测试APPkey -->
70   - <!--<meta-data-->
71   - <!--android:name="com.netease.nim.appKey"-->
72   - <!--android:value="330158c080acdf4dc1092d6a74576c2c" />-->
  70 + <!-- <meta-data -->
  71 + <!-- android:name="com.netease.nim.appKey" -->
  72 + <!-- android:value="330158c080acdf4dc1092d6a74576c2c" /> -->
73 73 <!-- 家长慧正式APPkey -->
74 74  
75 75 <meta-data
76 76 android:name="com.netease.nim.appKey"
77   - android:value="a1ff0bc08fa0d6f95b480d131e55584b" />
  77 + android:value="a1ff0bc08fa0d6f95b480d131e55584b"/>
78 78 <meta-data
79 79 android:name="android.max_aspect"
80   - android:value="2.1" />
  80 + android:value="2.1"/>
81 81  
82 82 <!-- 声明云信后台服务 -->
83 83 <service
84 84 android:name="com.netease.nimlib.service.NimService"
85   - android:process=":core" />
  85 + android:process=":core"/>
86 86  
87 87 <!-- 运行后台辅助服务 -->
88 88 <service
89 89 android:name="com.netease.nimlib.service.NimService$Aux"
90   - android:process=":core" />
  90 + android:process=":core"/>
91 91  
92 92 <!-- 声明云信后台辅助服务 -->
93 93 <service
94 94 android:name="com.netease.nimlib.job.NIMJobService"
95 95 android:exported="true"
96 96 android:permission="android.permission.BIND_JOB_SERVICE"
97   - android:process=":core" />
  97 + android:process=":core"/>
98 98  
99 99 <!-- 云信SDK的监视系统启动和网络变化的广播接收器,用户开机自启动以及网络变化时候重新登录 -->
100 100 <receiver
... ... @@ -102,50 +102,48 @@
102 102 android:exported="false"
103 103 android:process=":core">
104 104 <intent-filter>
105   - <action android:name="android.intent.action.BOOT_COMPLETED" />
106   - <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  105 + <action android:name="android.intent.action.BOOT_COMPLETED"/>
  106 + <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
107 107 </intent-filter>
108 108 </receiver>
109 109  
110 110 <!-- 云信进程间通信receiver -->
111   - <receiver android:name="com.netease.nimlib.service.ResponseReceiver" />
  111 + <receiver android:name="com.netease.nimlib.service.ResponseReceiver"/>
112 112  
113 113 <!-- 云信进程间通信service -->
114   - <service android:name="com.netease.nimlib.service.ResponseService" />
  114 + <service android:name="com.netease.nimlib.service.ResponseService"/>
115 115  
116 116 <meta-data
117 117 android:name="com.amap.api.v2.apikey"
118   - android:value="1d130afb822d8a1019e6592cbaf10bcc" />
  118 + android:value="1d130afb822d8a1019e6592cbaf10bcc"/>
119 119  
120 120 <activity
121 121 android:name=".ui.activity.StartActivity"
122 122 android:launchMode="singleInstance"
123 123 android:windowSoftInputMode="adjustPan|stateAlwaysHidden">
124 124 <intent-filter>
125   - <action android:name="android.intent.action.MAIN" />
  125 + <action android:name="android.intent.action.MAIN"/>
126 126  
127   - <category android:name="android.intent.category.LAUNCHER" />
  127 + <category android:name="android.intent.category.LAUNCHER"/>
128 128 </intent-filter>
129 129 </activity>
130   - <!--<activity-->
131   - <!--android:name=".ui.MainActivity"-->
132   - <!--android:screenOrientation="portrait"-->
133   - <!--android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />-->
  130 + <!-- <activity -->
  131 + <!-- android:name=".ui.MainActivity" -->
  132 + <!-- android:screenOrientation="portrait" -->
  133 + <!-- android:windowSoftInputMode="adjustPan|stateAlwaysHidden" /> -->
134 134 <!-- <activity -->
135 135 <!-- android:name=".ui.MainActivity" -->
136 136 <!-- android:screenOrientation="portrait" -->
137 137 <!-- android:windowSoftInputMode="adjustPan|stateAlwaysHidden" /> -->
138 138 <activity
139 139 android:name=".ui.activity.MyChildActivity"
140   - android:screenOrientation="portrait" />
  140 + android:screenOrientation="portrait"/>
141 141 <activity
142 142 android:name=".ui.activity.consult.ConsultOneLevelActivity"
143   - android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />
144   -
  143 + android:windowSoftInputMode="adjustPan|stateAlwaysHidden"/>
145 144 <activity
146 145 android:name=".ui.MainActivity"
147 146 android:screenOrientation="portrait"/>
148   -
149 147 <activity
150 148 android:name=".ui.activity.ChildDetialActivity"
151 149 android:launchMode="singleInstance"
... ... @@ -154,27 +152,25 @@
154 152 android:name=".ui.activity.binding.CreateChildInfoActivity"
155 153 android:launchMode="singleInstance"
156 154 android:screenOrientation="portrait"
157   - android:windowSoftInputMode="adjustPan|stateHidden" />
  155 + android:windowSoftInputMode="adjustPan|stateHidden"/>
158 156 <activity
159 157 android:name=".ui.activity.binding.SelectSchoolActivity"
160 158 android:screenOrientation="portrait"
161   - android:windowSoftInputMode="adjustPan|stateHidden" />
162   -
  159 + android:windowSoftInputMode="adjustPan|stateHidden"/>
163 160 <activity
164 161 android:name=".ui.activity.LoginAndRegistActivity"
165 162 android:screenOrientation="portrait"
166   - android:windowSoftInputMode="adjustPan|stateHidden" />
  163 + android:windowSoftInputMode="adjustPan|stateHidden"/>
167 164 <activity
168 165 android:name=".ui.activity.PersonInfoActivity"
169 166 android:launchMode="singleInstance"
170 167 android:screenOrientation="portrait"
171   - android:windowSoftInputMode="adjustPan|stateHidden" />
  168 + android:windowSoftInputMode="adjustPan|stateHidden"/>
172 169 <activity
173 170 android:name=".ui.activity.binding.CheckInfoActivity"
174 171 android:launchMode="singleInstance"
175 172 android:screenOrientation="portrait"
176   - android:windowSoftInputMode="adjustPan|stateHidden" />
177   -
  173 + android:windowSoftInputMode="adjustPan|stateHidden"/>
178 174 <activity
179 175 android:name=".ui.activity.binding.InviteCodeActivity"
180 176 android:launchMode="singleInstance"
... ... @@ -183,20 +179,21 @@
183 179 android:name=".ui.activity.mywebview.WebViewActivity"
184 180 android:launchMode="singleInstance"
185 181 android:screenOrientation="portrait"/>
186   -
187 182 <activity
188 183 android:name=".ui.activity.consult.ConsultTwoLevelActivity"
189 184 android:launchMode="singleInstance"
190   - android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />
191   -
  185 + android:windowSoftInputMode="adjustPan|stateAlwaysHidden"/>
192 186 <activity
193 187 android:name=".ui.activity.orderdetail.OrderDetailActivity"
194   - android:launchMode="singleInstance" />
  188 + android:launchMode="singleInstance"/>
195 189  
196 190 <service
197 191 android:name=".ui.service.BadgeIntentService"
198 192 android:exported="false">
199 193 </service>
  194 +
  195 + <activity android:name=".DataBaseTestActivity">
  196 + </activity>
200 197 </application>
201 198  
202 199 </manifest>
203 200 \ No newline at end of file
... ...
app/src/main/assets/migrations/1.sql 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +ALTER table message add COLUMN test TEXT
  2 +UPDATE message SET test = 'sql默认' WHERE tes t= NULL--试过了,执行了,但是没有结果,并没有更新数据库内容
... ...
app/src/main/java/com/shunzhi/parent/AppContext.java
... ... @@ -21,10 +21,12 @@ import com.share.mvpsdk.helper.RetrofitCreateHelper;
21 21 import com.shunzhi.parent.bean.message.DaoMaster;
22 22 import com.shunzhi.parent.bean.message.DaoMaster.DevOpenHelper;
23 23 import com.shunzhi.parent.bean.message.DaoSession;
  24 +import com.shunzhi.parent.dbhelper.GreenDaoDatabaseOpenHelper;
24 25 import com.shunzhi.parent.manager.MessageManager;
25 26 import com.shunzhi.parent.ui.MainActivity;
26 27  
27 28 import org.greenrobot.greendao.database.Database;
  29 +import org.greenrobot.greendao.database.DatabaseOpenHelper;
28 30  
29 31 /**
30 32 * Created by Administrator on 2018/3/7 0007.
... ... @@ -79,7 +81,7 @@ public class AppContext extends GlobalApplication {
79 81 // 经md5加密后取前n位做密码
80 82 // DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "notes-db-encrypted" : "notes-db");
81 83 // Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();
82   - DevOpenHelper helper = new DevOpenHelper(this, "pw_messages");
  84 + DatabaseOpenHelper helper = new GreenDaoDatabaseOpenHelper(this, "pw_messages");
83 85 Database db = helper.getWritableDb();
84 86 daoSession = new DaoMaster(db).newSession();
85 87 }
... ...
app/src/main/java/com/shunzhi/parent/bean/message/PHMessage.java
... ... @@ -34,11 +34,11 @@ public class PHMessage {
34 34 private Integer sendState;//消息发送的状态 1未发送(或者null,不建议使用null) 2发送中 3发送成功 4发送失败
35 35 private Integer sessionType;
36 36  
  37 +
37 38 @Generated(hash = 1935192071)
38 39 public PHMessage(Long id, Date date, String messageId, String sessionId,
39   - @NotNull String messageText, String exValue, String filePath,
40   - String fileUrl, String messageType, Integer sendState,
41   - Integer sessionType) {
  40 + @NotNull String messageText, String exValue, String filePath, String fileUrl,
  41 + String messageType, Integer sendState, Integer sessionType) {
42 42 this.id = id;
43 43 this.date = date;
44 44 this.messageId = messageId;
... ... @@ -160,4 +160,5 @@ public class PHMessage {
160 160 public void setSessionType(Integer sessionType) {
161 161 this.sessionType = sessionType;
162 162 }
  163 +
163 164 }
... ...
app/src/main/java/com/shunzhi/parent/dbhelper/DBUpdateHelper.java 0 → 100644
... ... @@ -0,0 +1,137 @@
  1 +package com.shunzhi.parent.dbhelper;
  2 +
  3 +import android.content.Context;
  4 +import android.database.sqlite.SQLiteDatabase;
  5 +import android.support.annotation.StringDef;
  6 +import android.text.TextUtils;
  7 +import android.util.Log;
  8 +
  9 +import com.shunzhi.parent.dbhelper.utils.IOUtils;
  10 +import com.shunzhi.parent.dbhelper.utils.NaturalOrderComparator;
  11 +import com.shunzhi.parent.dbhelper.utils.SqlParser;
  12 +
  13 +import org.greenrobot.greendao.database.Database;
  14 +
  15 +import java.io.BufferedReader;
  16 +import java.io.IOException;
  17 +import java.io.InputStream;
  18 +import java.io.InputStreamReader;
  19 +import java.lang.annotation.Retention;
  20 +import java.lang.annotation.RetentionPolicy;
  21 +import java.util.Arrays;
  22 +import java.util.Collections;
  23 +import java.util.List;
  24 +
  25 +import timber.log.Timber;
  26 +
  27 +public class DBUpdateHelper {
  28 +
  29 + private Context context;
  30 + public final static String SQL_PARSER_LEGACY = "legacy";
  31 + public final static String SQL_PARSER_DELIMITED = "delimited";
  32 +
  33 + private final String mSqlParser;
  34 +
  35 + @StringDef({SQL_PARSER_DELIMITED, SQL_PARSER_LEGACY})
  36 + @Retention(RetentionPolicy.SOURCE)
  37 + public @interface SQLParser {
  38 +
  39 + }
  40 +
  41 + public DBUpdateHelper(Context context, @SQLParser String sqlParser) {
  42 + this.context = context.getApplicationContext();
  43 + mSqlParser = sqlParser;
  44 + }
  45 +
  46 + public boolean onUpdate(Database db, int oldVersion, int newVersion) {
  47 + return executeMigrations(db, oldVersion, newVersion);
  48 + }
  49 +
  50 + private boolean executeMigrations(Database db, int oldVersion, int newVersion) {
  51 + boolean migrationExecuted = false;
  52 + try {
  53 + final List<String> files = Arrays.asList(context.getAssets().list("migrations"));
  54 + Collections.sort(files, new NaturalOrderComparator());
  55 +
  56 + db.beginTransaction();
  57 + try {
  58 + for (String file : files) {
  59 + try {
  60 + final int version = Integer.valueOf(file.replace(".sql", ""));
  61 +
  62 + if (version > oldVersion && version <= newVersion) {
  63 + executeSqlScript(db, file);
  64 + migrationExecuted = true;
  65 + Timber.i("---==="+file + " executed succesfully.");
  66 + }
  67 + } catch (NumberFormatException e) {
  68 + e.printStackTrace();
  69 + }
  70 + }
  71 + db.setTransactionSuccessful();
  72 + } finally {
  73 + db.endTransaction();
  74 + }
  75 + } catch (IOException e) {
  76 + e.printStackTrace();
  77 + }
  78 +
  79 + return migrationExecuted;
  80 + }
  81 +
  82 + private final static String MIGRATION_PATH = "migrations";
  83 +
  84 + private void executeSqlScript(Database db, String file) {
  85 +
  86 + InputStream stream = null;
  87 +
  88 + try {
  89 + stream = context.getAssets().open(MIGRATION_PATH + "/" + file);
  90 + //因为我懒,不允许自定义解析方式
  91 + //算了,还是加上吧 突然忘了类型限定怎么写了 就当练练手
  92 + if (SQL_PARSER_DELIMITED.equalsIgnoreCase(mSqlParser)) {
  93 + executeDelimitedSqlScript(db, stream);
  94 + } else {
  95 + executeLegacySqlScript(db, stream);
  96 + }
  97 + } catch (IOException e) {
  98 + e.printStackTrace();
  99 + } finally {
  100 + IOUtils.closeQuietly(stream);
  101 +
  102 + }
  103 + }
  104 +
  105 + private void executeDelimitedSqlScript(Database db, InputStream stream) throws IOException {
  106 +
  107 + List<String> commands = SqlParser.parse(stream);
  108 +
  109 + for (String command : commands) {
  110 + db.execSQL(command);
  111 + }
  112 + }
  113 +
  114 + private void executeLegacySqlScript(Database db, InputStream stream) throws IOException {
  115 +
  116 + InputStreamReader reader = null;
  117 + BufferedReader buffer = null;
  118 +
  119 + try {
  120 + reader = new InputStreamReader(stream);
  121 + buffer = new BufferedReader(reader);
  122 + String line = null;
  123 +
  124 + while ((line = buffer.readLine()) != null) {
  125 + line = line.replace(";", "").trim();
  126 + if (!TextUtils.isEmpty(line)) {
  127 + db.execSQL(line);
  128 + }
  129 + }
  130 +
  131 + } finally {
  132 + IOUtils.closeQuietly(buffer);
  133 + IOUtils.closeQuietly(reader);
  134 +
  135 + }
  136 + }
  137 +}
... ...
app/src/main/java/com/shunzhi/parent/dbhelper/GreenDaoDatabaseOpenHelper.java 0 → 100644
... ... @@ -0,0 +1,36 @@
  1 +package com.shunzhi.parent.dbhelper;
  2 +
  3 +import android.content.Context;
  4 +import android.database.sqlite.SQLiteDatabase;
  5 +
  6 +import com.shunzhi.parent.bean.message.DaoMaster;
  7 +
  8 +import org.greenrobot.greendao.database.Database;
  9 +
  10 +import timber.log.Timber;
  11 +
  12 +/**
  13 + * Created by 10501 on 2018/3/27.
  14 + */
  15 +
  16 +public class GreenDaoDatabaseOpenHelper extends DaoMaster.OpenHelper {
  17 + private Context context;
  18 +
  19 + public GreenDaoDatabaseOpenHelper(Context context, String name) {
  20 + super(context, name);
  21 + this.context = context;
  22 + }
  23 +
  24 + public GreenDaoDatabaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
  25 + super(context, name, factory);
  26 + this.context = context;
  27 + }
  28 +
  29 + @Override
  30 + public void onUpgrade(Database db, int oldVersion, int newVersion) {
  31 + super.onUpgrade(db, oldVersion, newVersion);
  32 + DBUpdateHelper updateHelper = new DBUpdateHelper(context, DBUpdateHelper.SQL_PARSER_LEGACY);
  33 + boolean isSuccess = updateHelper.onUpdate(db, oldVersion, newVersion);
  34 + Timber.i("---===onUpgrade isSuccess : ", isSuccess);
  35 + }
  36 +}
... ...
app/src/main/java/com/shunzhi/parent/dbhelper/utils/IOUtils.java 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +package com.shunzhi.parent.dbhelper.utils;
  2 +
  3 +import android.database.Cursor;
  4 +import android.util.Log;
  5 +
  6 +import java.io.Closeable;
  7 +import java.io.IOException;
  8 +
  9 +/**
  10 + * Created by 10501 on 2018/3/26.
  11 + */
  12 +
  13 +public class IOUtils {
  14 + public static void closeQuietly(Closeable closeable) {
  15 + if(closeable != null) {
  16 + try {
  17 + closeable.close();
  18 + } catch (IOException var2) {
  19 + var2.printStackTrace();
  20 + }
  21 +
  22 + }
  23 + }
  24 +
  25 + public static void closeQuietly(Cursor cursor) {
  26 + if(cursor != null) {
  27 + try {
  28 + cursor.close();
  29 + } catch (Exception var2) {
  30 + var2.printStackTrace();
  31 + }
  32 +
  33 + }
  34 + }
  35 +}
... ...
app/src/main/java/com/shunzhi/parent/dbhelper/utils/NaturalOrderComparator.java 0 → 100644
... ... @@ -0,0 +1,117 @@
  1 +package com.shunzhi.parent.dbhelper.utils;
  2 +
  3 +import java.util.Comparator;
  4 +
  5 +public class NaturalOrderComparator implements Comparator<Object> {
  6 + int compareRight(String a, String b) {
  7 + int bias = 0;
  8 + int ia = 0;
  9 + int ib = 0;
  10 +
  11 + // The longest run of digits wins. That aside, the greatest
  12 + // value wins, but we can't know that it will until we've scanned
  13 + // both numbers to know that they have the same magnitude, so we
  14 + // remember it in BIAS.
  15 + for (;; ia++, ib++) {
  16 + char ca = charAt(a, ia);
  17 + char cb = charAt(b, ib);
  18 +
  19 + if (!Character.isDigit(ca) && !Character.isDigit(cb)) {
  20 + return bias;
  21 + }
  22 + else if (!Character.isDigit(ca)) {
  23 + return -1;
  24 + }
  25 + else if (!Character.isDigit(cb)) {
  26 + return +1;
  27 + }
  28 + else if (ca < cb) {
  29 + if (bias == 0) {
  30 + bias = -1;
  31 + }
  32 + }
  33 + else if (ca > cb) {
  34 + if (bias == 0)
  35 + bias = +1;
  36 + }
  37 + else if (ca == 0 && cb == 0) {
  38 + return bias;
  39 + }
  40 + }
  41 + }
  42 +
  43 + public int compare(Object o1, Object o2) {
  44 + String a = o1.toString();
  45 + String b = o2.toString();
  46 +
  47 + int ia = 0, ib = 0;
  48 + int nza = 0, nzb = 0;
  49 + char ca, cb;
  50 + int result;
  51 +
  52 + while (true) {
  53 + // only count the number of zeroes leading the last number compared
  54 + nza = nzb = 0;
  55 +
  56 + ca = charAt(a, ia);
  57 + cb = charAt(b, ib);
  58 +
  59 + // skip over leading spaces or zeros
  60 + while (Character.isSpaceChar(ca) || ca == '0') {
  61 + if (ca == '0') {
  62 + nza++;
  63 + }
  64 + else {
  65 + // only count consecutive zeroes
  66 + nza = 0;
  67 + }
  68 +
  69 + ca = charAt(a, ++ia);
  70 + }
  71 +
  72 + while (Character.isSpaceChar(cb) || cb == '0') {
  73 + if (cb == '0') {
  74 + nzb++;
  75 + }
  76 + else {
  77 + // only count consecutive zeroes
  78 + nzb = 0;
  79 + }
  80 +
  81 + cb = charAt(b, ++ib);
  82 + }
  83 +
  84 + // process run of digits
  85 + if (Character.isDigit(ca) && Character.isDigit(cb)) {
  86 + if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0) {
  87 + return result;
  88 + }
  89 + }
  90 +
  91 + if (ca == 0 && cb == 0) {
  92 + // The strings compare the same. Perhaps the caller
  93 + // will want to call strcmp to break the tie.
  94 + return nza - nzb;
  95 + }
  96 +
  97 + if (ca < cb) {
  98 + return -1;
  99 + }
  100 + else if (ca > cb) {
  101 + return +1;
  102 + }
  103 +
  104 + ++ia;
  105 + ++ib;
  106 + }
  107 + }
  108 +
  109 + static char charAt(String s, int i) {
  110 + if (i >= s.length()) {
  111 + return 0;
  112 + }
  113 + else {
  114 + return s.charAt(i);
  115 + }
  116 + }
  117 +}
0 118 \ No newline at end of file
... ...
app/src/main/java/com/shunzhi/parent/dbhelper/utils/SqlParser.java 0 → 100644
... ... @@ -0,0 +1,93 @@
  1 +package com.shunzhi.parent.dbhelper.utils;
  2 +
  3 +import java.io.BufferedInputStream;
  4 +import java.io.IOException;
  5 +import java.io.InputStream;
  6 +import java.util.ArrayList;
  7 +import java.util.List;
  8 +
  9 +
  10 +public class SqlParser {
  11 +
  12 + public final static int STATE_NONE = 0;
  13 + public final static int STATE_STRING = 1;
  14 + public final static int STATE_COMMENT = 2;
  15 + public final static int STATE_COMMENT_BLOCK = 3;
  16 +
  17 + public static List<String> parse(final InputStream stream) throws IOException {
  18 +
  19 + final BufferedInputStream buffer = new BufferedInputStream(stream);
  20 + final List<String> commands = new ArrayList<String>();
  21 + final StringBuffer sb = new StringBuffer();
  22 +
  23 + try {
  24 + final Tokenizer tokenizer = new Tokenizer(buffer);
  25 + int state = STATE_NONE;
  26 +
  27 + while (tokenizer.hasNext()) {
  28 + final char c = (char) tokenizer.next();
  29 +
  30 + if (state == STATE_COMMENT_BLOCK) {
  31 + if (tokenizer.skip("*/")) {
  32 + state = STATE_NONE;
  33 + }
  34 + continue;
  35 +
  36 + } else if (state == STATE_COMMENT) {
  37 + if (isNewLine(c)) {
  38 + state = STATE_NONE;
  39 + }
  40 + continue;
  41 +
  42 + } else if (state == STATE_NONE && tokenizer.skip("/*")) {
  43 + state = STATE_COMMENT_BLOCK;
  44 + continue;
  45 +
  46 + } else if (state == STATE_NONE && tokenizer.skip("--")) {
  47 + state = STATE_COMMENT;
  48 + continue;
  49 +
  50 + } else if (state == STATE_NONE && c == ';') {
  51 + final String command = sb.toString().trim();
  52 + commands.add(command);
  53 + sb.setLength(0);
  54 + continue;
  55 +
  56 + } else if (state == STATE_NONE && c == '\'') {
  57 + state = STATE_STRING;
  58 +
  59 + } else if (state == STATE_STRING && c == '\'') {
  60 + state = STATE_NONE;
  61 +
  62 + }
  63 +
  64 + if (state == STATE_NONE || state == STATE_STRING) {
  65 + if (state == STATE_NONE && isWhitespace(c)) {
  66 + if (sb.length() > 0 && sb.charAt(sb.length() - 1) != ' ') {
  67 + sb.append(' ');
  68 + }
  69 + } else {
  70 + sb.append(c);
  71 + }
  72 + }
  73 + }
  74 +
  75 + } finally {
  76 + IOUtils.closeQuietly(buffer);
  77 + }
  78 +
  79 + if (sb.length() > 0) {
  80 + commands.add(sb.toString().trim());
  81 + }
  82 +
  83 + return commands;
  84 + }
  85 +
  86 + private static boolean isNewLine(final char c) {
  87 + return c == '\r' || c == '\n';
  88 + }
  89 +
  90 + private static boolean isWhitespace(final char c) {
  91 + return c == '\r' || c == '\n' || c == '\t' || c == ' ';
  92 + }
  93 +}
... ...
app/src/main/java/com/shunzhi/parent/dbhelper/utils/Tokenizer.java 0 → 100644
... ... @@ -0,0 +1,59 @@
  1 +package com.shunzhi.parent.dbhelper.utils;
  2 +
  3 +import java.io.IOException;
  4 +import java.io.InputStream;
  5 +
  6 +
  7 +public class Tokenizer {
  8 +
  9 + private final InputStream mStream;
  10 +
  11 + private boolean mIsNext;
  12 + private int mCurrent;
  13 +
  14 + public Tokenizer(final InputStream in) {
  15 + this.mStream = in;
  16 + }
  17 +
  18 + public boolean hasNext() throws IOException {
  19 +
  20 + if (!this.mIsNext) {
  21 + this.mIsNext = true;
  22 + this.mCurrent = this.mStream.read();
  23 + }
  24 + return this.mCurrent != -1;
  25 + }
  26 +
  27 + public int next() throws IOException {
  28 +
  29 + if (!this.mIsNext) {
  30 + this.mCurrent = this.mStream.read();
  31 + }
  32 + this.mIsNext = false;
  33 + return this.mCurrent;
  34 + }
  35 +
  36 + public boolean skip(final String s) throws IOException {
  37 +
  38 + if (s == null || s.length() == 0) {
  39 + return false;
  40 + }
  41 +
  42 + if (s.charAt(0) != this.mCurrent) {
  43 + return false;
  44 + }
  45 +
  46 + final int len = s.length();
  47 + this.mStream.mark(len - 1);
  48 +
  49 + for (int n = 1; n < len; n++) {
  50 + final int value = this.mStream.read();
  51 +
  52 + if (value != s.charAt(n)) {
  53 + this.mStream.reset();
  54 + return false;
  55 + }
  56 + }
  57 + return true;
  58 + }
  59 +}
... ...
app/src/main/java/com/shunzhi/parent/ui/fragment/MineFragment.java
... ... @@ -18,6 +18,8 @@ import com.share.mvpsdk.base.fragment.BaseMVPCompatFragment;
18 18 import com.share.mvpsdk.utils.CacheUtils;
19 19 import com.shunzhi.parent.AppConfig;
20 20 import com.shunzhi.parent.AppContext;
  21 +import com.shunzhi.parent.BuildConfig;
  22 +import com.shunzhi.parent.DataBaseTestActivity;
21 23 import com.shunzhi.parent.R;
22 24 import com.shunzhi.parent.contract.loginandregister.LoginAndRegisterContract;
23 25 import com.shunzhi.parent.contract.mine.MineContract;
... ... @@ -73,15 +75,19 @@ public class MineFragment extends BaseMVPCompatFragment&lt;LoginAndRegisterContract
73 75 tvExit.setOnClickListener(this);
74 76 binding_state = view.findViewById(R.id.binding_state);
75 77 layout_afterLogin.setVisibility(View.GONE);
76   -
  78 + if (BuildConfig.DEBUG) {
  79 + View enter = view.findViewById(R.id.testEnter);
  80 + enter.setVisibility(View.VISIBLE);
  81 + enter.setOnClickListener(this);
  82 + } else view.findViewById(R.id.testEnter).setVisibility(View.GONE);
77 83  
78 84 }
79 85  
80 86 private void setPersonInfo() {
81 87  
82   - String useName=AppConfig.getAppConfig(getContext()).get(AppConfig.USER_NAME);
83   - if (!TextUtils.isEmpty(useName))AppConfig.ISLOGIN=true;
84   - else AppConfig.ISLOGIN=false;
  88 + String useName = AppConfig.getAppConfig(getContext()).get(AppConfig.USER_NAME);
  89 + if (!TextUtils.isEmpty(useName)) AppConfig.ISLOGIN = true;
  90 + else AppConfig.ISLOGIN = false;
85 91  
86 92 if (TextUtils.isEmpty(AppConfig.getAppConfig(getContext()).get(AppConfig.ISBINDING))) {
87 93 binding_state.setText("");
... ... @@ -148,7 +154,9 @@ public class MineFragment extends BaseMVPCompatFragment&lt;LoginAndRegisterContract
148 154  
149 155 case R.id.layout_feedback:
150 156 WebViewActivity.getInstance(getActivity(), AppConfig.BASE_URL_ORDER + "FeedBack.aspx?userid=" + AppConfig.getAppConfig(AppContext.getInstance()).get(AppConfig.USER_ID), -1);
151   -
  157 + break;
  158 + case R.id.testEnter:
  159 + DataBaseTestActivity.start(this);
152 160 break;
153 161 default:
154 162 break;
... ...
app/src/main/res/layout/fragment_mine.xml
... ... @@ -339,6 +339,20 @@
339 339 android:textColor="@color/white"
340 340 android:textSize="@dimen/size_dp_16" />
341 341  
  342 + <TextView
  343 + android:id="@+id/testEnter"
  344 + android:layout_width="match_parent"
  345 + android:layout_height="?android:actionBarSize"
  346 + android:layout_gravity="center_vertical"
  347 + android:gravity="center"
  348 + android:layout_weight="1"
  349 + android:layout_marginTop="@dimen/size_dp_15"
  350 + android:layout_marginBottom="@dimen/size_dp_15"
  351 + android:background="@drawable/shape_xueqing_radius8"
  352 + android:text="测试入口"
  353 + android:textColor="@color/white"
  354 + android:textSize="@dimen/size_dp_16" />
  355 +
342 356 </LinearLayout>
343 357 </ScrollView>
344 358  
... ...