Yuvipanda has uploaded a new change for review.
https://gerrit.wikimedia.org/r/98590
Change subject: WIP: Add support for getting data in and out of SQLite
......................................................................
WIP: Add support for getting data in and out of SQLite
Change-Id: Ifac43dec5b29a7668f65b1f55a5caa1dd431ed1a
---
A wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java
A
wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
A
wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
A
wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
A
wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
8 files changed, 304 insertions(+), 0 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/90/98590/1
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java
new file mode 100644
index 0000000..9d1fbe6
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java
@@ -0,0 +1,26 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.ContentProviderClient;
+import android.net.Uri;
+import android.os.RemoteException;
+
+abstract public class ContentPersister<T> {
+ private final ContentProviderClient client;
+ private final PersistanceHelper<T> persistanceHelper;
+
+ public ContentPersister(ContentProviderClient client, PersistanceHelper<T>
persistanceHelper) {
+ this.client = client;
+ this.persistanceHelper = persistanceHelper;
+ }
+
+ public void persist(T obj) {
+ Uri uri =
Uri.parse(SQLiteContentProvider.getAuthorityForTable(persistanceHelper.getTableName())
+ ":///");
+
+ try {
+ client.insert(uri, persistanceHelper.toContentValues(obj));
+ } catch (RemoteException e) {
+ // This shouldn't happen
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java
new file mode 100644
index 0000000..1b1b727
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java
@@ -0,0 +1,23 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.*;
+import android.database.sqlite.*;
+
+public class DBOpenHelper extends SQLiteOpenHelper{
+
+ private static final String DATABASE_NAME = "wikipedia.db";
+ private static final int DATABASE_VERSION = 1;
+
+ public DBOpenHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+
+ @Override
+ public void onCreate(SQLiteDatabase sqLiteDatabase) {
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase sqLiteDatabase, int from, int to) {
+ }
+}
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java
new file mode 100644
index 0000000..0f025a6
--- /dev/null
+++
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java
@@ -0,0 +1,61 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public abstract class PersistanceHelper<T> {
+
+ public static class Column{
+ private final String name;
+ private final String type;
+
+ public String getName() {
+ return name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public Column(String name, String type) {
+ this.name = name;
+ this.type = type;
+ }
+
+ @Override
+ public String toString() {
+ return getName() + " " + getType();
+ }
+ }
+
+ abstract public T fromCursor(Cursor c);
+
+ abstract protected ContentValues toContentValues(T obj);
+
+ abstract public String getTableName();
+
+ abstract public Column[] getColumnsAdded(int version);
+
+ public ArrayList<Column> getElements(int version) {
+ ArrayList<Column> columns = new ArrayList<Column>();
+ for (int i = 1; i <= version; i++) {
+ columns.addAll(Arrays.asList(getColumnsAdded(i)));
+ }
+ return columns;
+ }
+
+ private String getSchema(int version) {
+ String tableName = getTableName();
+ ArrayList<Column> columns = getElements(version);
+ StringBuilder builder = new StringBuilder();
+ builder.append("CREATE TABLE ").append(tableName).append(" ( ")
+ .append(TextUtils.join(", ", columns))
+ .append(" );");
+
+ return builder.toString();
+ }
+}
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
new file mode 100644
index 0000000..01f2ea2
--- /dev/null
+++
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
@@ -0,0 +1,109 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+
+abstract public class SQLiteContentProvider<T> extends ContentProvider {
+ private final PersistanceHelper<T> persistanceHelper;
+ private final DBOpenHelper dbOpenHelper;
+ protected SQLiteContentProvider(PersistanceHelper<T> persistanceHelper,
DBOpenHelper dbOpenHelper) {
+ this.persistanceHelper = persistanceHelper;
+ this.dbOpenHelper = dbOpenHelper;
+ }
+
+ private final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ private static final int MATCH_ALL = 1;
+
+ @Override
+ public boolean onCreate() {
+ uriMatcher.addURI(getAuthority(), persistanceHelper.getTableName(),
MATCH_ALL);
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
+ SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
+ queryBuilder.setTables(persistanceHelper.getTableName());
+
+ int uriType = uriMatcher.match(uri);
+
+ SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
+ Cursor cursor;
+
+ switch (uriType) {
+ case MATCH_ALL:
+ cursor = queryBuilder.query(db, projection, selection,
selectionArgs, null, null, sortOrder);
+ break;
+ default:
+ throw new IllegalArgumentException("Uri " + uri + " does not
match any matcher!");
+ }
+
+ cursor.setNotificationUri(getContext().getContentResolver(), uri);
+
+ return cursor;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ int uriType = uriMatcher.match(uri);
+ SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase();
+ switch (uriType) {
+ case MATCH_ALL:
+ sqlDB.insert(persistanceHelper.getTableName(), null, values);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown URI: " + uri);
+ }
+ getContext().getContentResolver().notifyChange(uri, null);
+ return uri;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ throw new IllegalArgumentException("Delete functionality not
implemented");
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
+ throw new IllegalArgumentException("Update functionality not
implemented");
+ }
+
+ @Override
+ public int bulkInsert(Uri uri, ContentValues[] values) {
+ int uriType = uriMatcher.match(uri);
+ SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase();
+ sqlDB.beginTransaction();
+ switch (uriType) {
+ case MATCH_ALL:
+ for(ContentValues value: values) {
+ sqlDB.insert(persistanceHelper.getTableName(), null,
value);
+ }
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown URI: " + uri);
+ }
+ sqlDB.setTransactionSuccessful();
+ sqlDB.endTransaction();
+ getContext().getContentResolver().notifyChange(uri, null);
+ return values.length;
+
+ }
+
+ protected String getAuthority() {
+ return getAuthorityForTable(persistanceHelper.getTableName());
+ }
+
+ public static final String getAuthorityForTable(String table) {
+ return "org.wikimedia.wikipedia." + table;
+ }
+}
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
index 06e5f96..e6bf4be 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
@@ -7,6 +7,8 @@
import java.util.Date;
public class HistoryEntry implements Parcelable {
+ public static final HistoryEntryPersistanceHelper persistanceHelper = new
HistoryEntryPersistanceHelper();
+
public static final int SOURCE_SEARCH = 1;
public static final int SOURCE_INTERNAL_LINK = 2;
public static final int SOURCE_EXTERNAL_LINK = 3;
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
new file mode 100644
index 0000000..69ad685
--- /dev/null
+++
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
@@ -0,0 +1,10 @@
+package org.wikimedia.wikipedia.history;
+
+import org.wikimedia.wikipedia.data.DBOpenHelper;
+import org.wikimedia.wikipedia.data.SQLiteContentProvider;
+
+public class HistoryEntryContentProvider extends
SQLiteContentProvider<HistoryEntry> {
+ protected HistoryEntryContentProvider(DBOpenHelper dbOpenHelper) {
+ super(HistoryEntry.persistanceHelper, dbOpenHelper);
+ }
+}
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
new file mode 100644
index 0000000..ab4b782
--- /dev/null
+++
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
@@ -0,0 +1,52 @@
+package org.wikimedia.wikipedia.history;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import org.wikimedia.wikipedia.PageTitle;
+import org.wikimedia.wikipedia.Site;
+import org.wikimedia.wikipedia.data.PersistanceHelper;
+
+import java.util.Date;
+
+public class HistoryEntryPersistanceHelper extends
PersistanceHelper<HistoryEntry> {
+ @Override
+ public HistoryEntry fromCursor(Cursor c) {
+ // Carefully, get them back by using position only
+ Site site = new Site(c.getString(1));
+ // FIXME: Does not handle non mainspace pages
+ PageTitle title = new PageTitle(null, c.getString(2), site);
+ Date timestamp = new Date(c.getLong(3));
+ int source = c.getInt(4);
+ return new HistoryEntry(title, timestamp, source);
+ }
+
+ @Override
+ protected ContentValues toContentValues(HistoryEntry obj) {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("title", obj.getTitle().getPrefixedText());
+ contentValues.put("timestamp", obj.getTimestamp().getTime());
+ contentValues.put("source", obj.getSource());
+ return contentValues;
+ }
+
+ @Override
+ public String getTableName() {
+ return "history";
+ }
+
+ @Override
+ public Column[] getColumnsAdded(int version) {
+ switch (version) {
+ case 1:
+ return new Column[] {
+ new Column("_id", "integer primary key"),
+ new Column("site", "string"),
+ new Column("title", "string"),
+ new Column("timestamp", "integer"),
+ new Column("source", "integer"),
+ };
+ default:
+ return new Column[0];
+ }
+ }
+}
diff --git
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
new file mode 100644
index 0000000..f77ad88
--- /dev/null
+++
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
@@ -0,0 +1,21 @@
+package org.wikimedia.wikipedia.history;
+
+import android.content.ContentProviderClient;
+import android.content.Context;
+import org.wikimedia.wikipedia.data.ContentPersister;
+import org.wikimedia.wikipedia.data.PersistanceHelper;
+import org.wikimedia.wikipedia.data.SQLiteContentProvider;
+
+public class HistoryEntryPersister extends ContentPersister<HistoryEntry> {
+ public HistoryEntryPersister(Context context) {
+ // lolJava
+ super(
+ context.getContentResolver().acquireContentProviderClient(
+ SQLiteContentProvider.getAuthorityForTable(
+ HistoryEntry.persistanceHelper.getTableName()
+ )
+ ),
+ HistoryEntry.persistanceHelper
+ );
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/98590
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifac43dec5b29a7668f65b1f55a5caa1dd431ed1a
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits