From c41b3fcfe2b61f59c60cdedd7c307a99bcba7f0e Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Thu, 13 Sep 2018 19:53:19 +0800 Subject: [PATCH] save databases works --- .../autojs/core/database/CursorHelper.java | 24 +++++ .../autojs/core/database/Database.java | 90 +++++++++++++++++++ .../core/database/DatabaseResultSet.java | 61 +++++++++++++ .../core/database/DatabaseVoidCallback.java | 5 ++ .../autojs/core/database/Databases.java | 11 +++ .../core/database/StatementCallback.java | 8 ++ .../core/database/StatementErrorCallback.java | 9 ++ .../autojs/core/database/Transaction.java | 32 +++++++ .../core/database/TransactionCallback.java | 5 ++ .../database/TransactionErrorCallback.java | 8 ++ 10 files changed, 253 insertions(+) create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/CursorHelper.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/Database.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/DatabaseResultSet.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/DatabaseVoidCallback.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/Databases.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/StatementCallback.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/StatementErrorCallback.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/Transaction.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/TransactionCallback.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/database/TransactionErrorCallback.java diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/CursorHelper.java b/autojs/src/main/java/com/stardust/autojs/core/database/CursorHelper.java new file mode 100644 index 00000000..5bcfacd4 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/CursorHelper.java @@ -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"); + } + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/Database.java b/autojs/src/main/java/com/stardust/autojs/core/database/Database.java new file mode 100644 index 00000000..03780e9a --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/Database.java @@ -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) { + + } + } + +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/DatabaseResultSet.java b/autojs/src/main/java/com/stardust/autojs/core/database/DatabaseResultSet.java new file mode 100644 index 00000000..0f79c574 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/DatabaseResultSet.java @@ -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> mData; + + + public RowList(ArrayList> 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> 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 readRowAsMap(Cursor cursor, int columnCount) { + Map 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; + } + +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/DatabaseVoidCallback.java b/autojs/src/main/java/com/stardust/autojs/core/database/DatabaseVoidCallback.java new file mode 100644 index 00000000..7d945ccc --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/DatabaseVoidCallback.java @@ -0,0 +1,5 @@ +package com.stardust.autojs.core.database; + +public interface DatabaseVoidCallback { + void handleEvent(); +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/Databases.java b/autojs/src/main/java/com/stardust/autojs/core/database/Databases.java new file mode 100644 index 00000000..5e8ed8e5 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/Databases.java @@ -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(); + } + + + +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/StatementCallback.java b/autojs/src/main/java/com/stardust/autojs/core/database/StatementCallback.java new file mode 100644 index 00000000..f8e721b0 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/StatementCallback.java @@ -0,0 +1,8 @@ +package com.stardust.autojs.core.database; + +import java.sql.ResultSet; + +public interface StatementCallback { + + void handleEvent(Transaction transaction, DatabaseResultSet resultSet); +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/StatementErrorCallback.java b/autojs/src/main/java/com/stardust/autojs/core/database/StatementErrorCallback.java new file mode 100644 index 00000000..504f7fc8 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/StatementErrorCallback.java @@ -0,0 +1,9 @@ +package com.stardust.autojs.core.database; + +import android.database.SQLException; + +public interface StatementErrorCallback { + + boolean handleEvent(Transaction transaction, SQLException error); + +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/Transaction.java b/autojs/src/main/java/com/stardust/autojs/core/database/Transaction.java new file mode 100644 index 00000000..9f155403 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/Transaction.java @@ -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(); + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/TransactionCallback.java b/autojs/src/main/java/com/stardust/autojs/core/database/TransactionCallback.java new file mode 100644 index 00000000..ab87a56d --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/TransactionCallback.java @@ -0,0 +1,5 @@ +package com.stardust.autojs.core.database; + +public interface TransactionCallback { + void handleEvent(Transaction transaction); +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/database/TransactionErrorCallback.java b/autojs/src/main/java/com/stardust/autojs/core/database/TransactionErrorCallback.java new file mode 100644 index 00000000..249e052a --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/database/TransactionErrorCallback.java @@ -0,0 +1,8 @@ +package com.stardust.autojs.core.database; + +import android.database.SQLException; + +public interface TransactionErrorCallback { + + void handleEvent(SQLException e); +}