/
DatabaseManager.java
107 lines (93 loc) · 3.97 KB
/
DatabaseManager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package javinator9889.securepass.io.database;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
import net.sqlcipher.database.SQLiteDatabase;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javinator9889.securepass.io.IOManager;
import javinator9889.securepass.util.resources.ISharedPreferencesManager;
import javinator9889.securepass.util.resources.SharedPreferencesManager;
import javinator9889.securepass.util.values.Constants;
/**
* Created by Javinator9889 on 26/03/2018.
* Based on SQLCipher documentation
*/
public class DatabaseManager {
private Context activityContext;
private File databaseFile;
private String userHashedPassword;
private Thread databaseInitializer;
@NonNull
public static DatabaseManager newInstance(Context activityContext,
@NonNull String userHashedPassword) {
return new DatabaseManager(activityContext, userHashedPassword);
}
private DatabaseManager(Context activityContext, @NonNull String userHashedPassword) {
this.activityContext = activityContext;
this.userHashedPassword = userHashedPassword;
initDB();
}
private void initDB() {
databaseInitializer = new Thread(new Runnable() {
private final Context databaseContext = DatabaseManager.this.activityContext;
private final String databasePassword = DatabaseManager.this.userHashedPassword;
@Override
public void run() {
SQLiteDatabase.loadLibs(databaseContext);
databaseFile = databaseContext
.getDatabasePath(Constants.SQL.DB_FILENAME);
try {
databaseFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
databaseFile,
databasePassword,
null);
List<String> databaseScripts;
ISharedPreferencesManager preferencesManager = SharedPreferencesManager
.newInstance();
try {
if (!preferencesManager.isDatabaseInitialized()) {
databaseScripts = IOManager.newInstance(databaseContext).loadSQLScript();
for (String script : databaseScripts) {
database.execSQL(script);
}
DatabaseManager.this.createDefaultCategory();
}
} catch (IOException e) {
throw new RuntimeException(e.getCause());
} finally {
database.close();
}
}
});
databaseInitializer.setName(Constants.SQL.DB_INIT_THREAD_NAME);
databaseInitializer.setUncaughtExceptionHandler(new ThreadExceptionHandler());
databaseInitializer.run();
}
public SQLiteDatabase getDatabaseInstance() {
SQLiteDatabase.loadLibs(activityContext);
return SQLiteDatabase.openOrCreateDatabase(databaseFile, userHashedPassword, null);
}
public Thread getDatabaseInitializer() {
return databaseInitializer;
}
private class ThreadExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
Log.e(t.getName(), "Exception in thread \"" + t.getName() + "\" with " +
"exception thrown -> " + e.getMessage() + "\nFull trace: ");
e.printStackTrace();
}
}
private void createDefaultCategory() {
DatabaseOperations operations = DatabaseOperations.newInstance(this);
long id = operations.registerDefaultCategory();
Log.d("DB", "Category ID: " + id);
operations.finishConnection();
}
}