package com.stardust.scriptdroid.statics;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.pushtorefresh.storio.sqlite.SQLiteTypeMapping;
import com.pushtorefresh.storio.sqlite.StorIOSQLite;
import com.pushtorefresh.storio.sqlite.impl.DefaultStorIOSQLite;
import com.pushtorefresh.storio.sqlite.queries.DeleteQuery;
import com.pushtorefresh.storio.sqlite.queries.Query;
import com.stardust.autojs.script.ScriptSource;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Stardust on 2017/5/5.
*/
public class SQLiteStaticsStorage implements ScriptStaticsStorage {
private static final int VERSION = 1;
private static final String DATABASE_NAME = "Ever.db";
static final String TABLE_NAME = "FinalEating";
private StorIOSQLite mStorIOSQLite;
public SQLiteStaticsStorage(Context context) {
mStorIOSQLite = DefaultStorIOSQLite.builder()
.sqliteOpenHelper(new SQLiteOpenHelper(context))
.addTypeMapping(ScriptStaticsRecord.class, new ScriptStaticsRecordSQLiteTypeMapping())
.build();
}
@Override
public void record(ScriptSource source) {
int times = getTimes(source) + 1;
mStorIOSQLite.put()
.object(new ScriptStaticsRecord(source.toString(), times))
.prepare()
.executeAsBlocking();
}
public int getTimes(ScriptSource source) {
ScriptStaticsRecord record = mStorIOSQLite.get()
.object(ScriptStaticsRecord.class)
.withQuery(Query.builder()
.table(TABLE_NAME)
.where("name = ?")
.whereArgs(source.toString())
.build())
.prepare()
.executeAsBlocking();
if (record != null) {
return record.times;
} else {
return 0;
}
}
@Override
public Map<String, String> getAll() {
List<ScriptStaticsRecord> records = mStorIOSQLite.get()
.listOfObjects(ScriptStaticsRecord.class)
.withQuery(Query.builder()
.table(TABLE_NAME)
.orderBy("times")
.build())
.prepare()
.executeAsBlocking();
return toMap(records);
}
private Map<String, String> toMap(List<ScriptStaticsRecord> records) {
Map<String, String> map = new HashMap<>();
for (ScriptStaticsRecord record : records) {
map.put(record.name, String.valueOf(record.times));
}
return map;
}
@Override
public Map<String, String> getMax(int size) {
List<ScriptStaticsRecord> records = mStorIOSQLite.get()
.listOfObjects(ScriptStaticsRecord.class)
.withQuery(Query.builder()
.table(TABLE_NAME)
.orderBy("times DESC")
.limit(size)
.build())
.prepare()
.executeAsBlocking();
return toMap(records);
}
@Override
public void clear() {
mStorIOSQLite.delete()
.byQuery(DeleteQuery.builder()
.table(TABLE_NAME)
.build())
.prepare()
.executeAsBlocking();
}
@Override
public void close() {
try {
mStorIOSQLite.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static class SQLiteOpenHelper extends android.database.sqlite.SQLiteOpenHelper {
SQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(\n"
+ "name TEXT NOT NULL PRIMARY KEY, "
+ "times INTEGER"
+ ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}