save databases works

This commit is contained in:
hyb1996 2018-09-13 19:53:19 +08:00
parent 0281563077
commit c41b3fcfe2
10 changed files with 253 additions and 0 deletions

View File

@ -0,0 +1,24 @@
package com.stardust.autojs.core.database;
import android.database.Cursor;
public class CursorHelper {
public static Object getValue(Cursor cursor, int column) {
switch (cursor.getType(column)) {
case Cursor.FIELD_TYPE_STRING:
return cursor.getShort(column);
case Cursor.FIELD_TYPE_FLOAT:
return cursor.getFloat(column);
case Cursor.FIELD_TYPE_INTEGER:
return cursor.getInt(column);
case Cursor.FIELD_TYPE_NULL:
return null;
case Cursor.FIELD_TYPE_BLOB:
return cursor.getBlob(column);
default:
throw new IllegalArgumentException("unknown type");
}
}
}

View File

@ -0,0 +1,90 @@
package com.stardust.autojs.core.database;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteTransactionListener;
public class Database {
private DatabasesOpenHelper mHelper;
private SQLiteDatabase mWritableDatabase;
private SQLiteDatabase mReadableDatabase;
public void executeSql(String sql){
mWritableDatabase.execSQL(sql);
}
public void transaction(TransactionCallback callback, TransactionErrorCallback errorCallback, DatabaseVoidCallback successCallback){
transactionInternal(mWritableDatabase, callback, errorCallback, successCallback);
}
public void readTransaction(TransactionCallback callback, TransactionErrorCallback errorCallback, DatabaseVoidCallback successCallback){
transactionInternal(mReadableDatabase, callback, errorCallback, successCallback);
}
public void changeVersion(int oldVersion, int newVersion, TransactionCallback callback, TransactionErrorCallback errorCallback, DatabaseVoidCallback successCallback){
transactionInternal(mWritableDatabase, new TransactionCallback() {
@Override
public void handleEvent(Transaction transaction) {
//TODO
if(transaction.getDatabase().getVersion() == oldVersion){
transaction.getDatabase().setVersion(newVersion);
callback.handleEvent(transaction);
}
}
}, errorCallback, successCallback);
}
private void transactionInternal(SQLiteDatabase database, TransactionCallback callback, TransactionErrorCallback errorCallback, DatabaseVoidCallback successCallback){
database.beginTransactionWithListener(new SQLiteTransactionListener() {
@Override
public void onBegin() {
Transaction transaction = new Transaction(database);
try {
callback.handleEvent(transaction);
transaction.succeed();
}catch (SQLException e){
errorCallback.handleEvent(e);
}finally {
transaction.end();
}
}
@Override
public void onCommit() {
successCallback.handleEvent();
}
@Override
public void onRollback() {
}
});
}
private static class DatabasesOpenHelper extends SQLiteOpenHelper {
public DatabasesOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public DatabasesOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
super(context, name, factory, version, errorHandler);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}

View File

@ -0,0 +1,61 @@
package com.stardust.autojs.core.database;
import android.database.Cursor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class DatabaseResultSet {
public static class RowList {
public final int length;
private final ArrayList<Map<String, Object>> mData;
public RowList(ArrayList<Map<String, Object>> data) {
mData = data;
length = mData.size();
}
public Object item(int i) {
return mData.get(i);
}
}
public final long insertId;
public final long rowsAffected;
public final RowList rows;
public static DatabaseResultSet fromCursor(Cursor cursor) {
ArrayList<Map<String, Object>> rows = new ArrayList<>();
if (!cursor.moveToFirst()) {
return null;
}
int columnCount = cursor.getColumnCount();
long insertId = cursor.getLong(0);
rows.add(readRowAsMap(cursor, columnCount));
while (cursor.moveToNext()) {
rows.add(readRowAsMap(cursor, columnCount));
}
cursor.close();
return new DatabaseResultSet(insertId, new RowList(rows));
}
private static Map<String, Object> readRowAsMap(Cursor cursor, int columnCount) {
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < columnCount; i++) {
map.put(cursor.getColumnName(i), CursorHelper.getValue(cursor, columnCount));
}
return map;
}
public DatabaseResultSet(long insertId, RowList rowList) {
this.insertId = insertId;
this.rowsAffected = rowList.length;
this.rows = rowList;
}
}

View File

@ -0,0 +1,5 @@
package com.stardust.autojs.core.database;
public interface DatabaseVoidCallback {
void handleEvent();
}

View File

@ -0,0 +1,11 @@
package com.stardust.autojs.core.database;
public class Databases {
public static Database openDatabase(String name, int version, String desc, long size){
return new Database();
}
}

View File

@ -0,0 +1,8 @@
package com.stardust.autojs.core.database;
import java.sql.ResultSet;
public interface StatementCallback {
void handleEvent(Transaction transaction, DatabaseResultSet resultSet);
}

View File

@ -0,0 +1,9 @@
package com.stardust.autojs.core.database;
import android.database.SQLException;
public interface StatementErrorCallback {
boolean handleEvent(Transaction transaction, SQLException error);
}

View File

@ -0,0 +1,32 @@
package com.stardust.autojs.core.database;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.sql.ResultSet;
public class Transaction {
private final SQLiteDatabase mDatabase;
public SQLiteDatabase getDatabase() {
return mDatabase;
}
public Transaction(SQLiteDatabase database) {
mDatabase = database;
}
public void executeSql(String sqlStatement, String[] arguments, StatementCallback callback, StatementErrorCallback errorCallback){
Cursor cursor = mDatabase.rawQuery(sqlStatement, arguments);
callback.handleEvent(this, DatabaseResultSet.fromCursor(cursor));
}
void succeed() {
mDatabase.setTransactionSuccessful();
}
void end() {
mDatabase.endTransaction();
}
}

View File

@ -0,0 +1,5 @@
package com.stardust.autojs.core.database;
public interface TransactionCallback {
void handleEvent(Transaction transaction);
}

View File

@ -0,0 +1,8 @@
package com.stardust.autojs.core.database;
import android.database.SQLException;
public interface TransactionErrorCallback {
void handleEvent(SQLException e);
}