summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Hua <whua@google.com>2012-08-24 16:06:41 -0700
committerWei Hua <whua@google.com>2012-08-24 16:06:41 -0700
commit2fc454f62ff5e11eb16a93a3d515a4e4fba89b5e (patch)
tree71b332f1074e907c22b0ee54f104b455de234005
parentf0f78449e8ab7d63894964c54b6ef390ca9ce044 (diff)
downloadml-2fc454f62ff5e11eb16a93a3d515a4e4fba89b5e.tar.gz
Adding helper classes for general persistent data saving.
convenience classes for saving data into aggregator database. Change-Id: I6c3efafb50e6ad02d518a69d1cffb550ae11f794
-rw-r--r--bordeaux/service/src/android/bordeaux/services/AggregatorRecordStorage.java114
-rw-r--r--bordeaux/service/src/android/bordeaux/services/AggregatorStorage.java57
-rw-r--r--bordeaux/service/src/android/bordeaux/services/BordeauxService.java1
-rw-r--r--bordeaux/service/src/android/bordeaux/services/BordeauxSessionStorage.java1
4 files changed, 172 insertions, 1 deletions
diff --git a/bordeaux/service/src/android/bordeaux/services/AggregatorRecordStorage.java b/bordeaux/service/src/android/bordeaux/services/AggregatorRecordStorage.java
new file mode 100644
index 000000000..647f638a6
--- /dev/null
+++ b/bordeaux/service/src/android/bordeaux/services/AggregatorRecordStorage.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bordeaux.services;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/* This class implements record like data storage for aggregator.
+ * The data is stored in the sqlite database row by row without primary key, all
+ * columns are assume having string value.
+ * Sample usage:
+ * AggregatorRecordStorage db = new AggregatorRecordStorage(this, "TestTable",
+ * new String[]{"clusterid", "long", "lat"});
+ * db.removeAllData();
+ * HashMap<String, String> row = new HashMap<String, String>();
+ * row.put("clusterid", "home");
+ * row.put("long", "110.203");
+ * row.put("lat", "-13.787");
+ * db.addData(row);
+ * row.put("clusterid", "office");
+ * row.put("long", "1.203");
+ * row.put("lat", "33.787");
+ * db.addData(row);
+ * List<Map<String,String> > allData = db.getAllData();
+ * Log.i(TAG,"Total data in database: " + allData.size());
+ */
+class AggregatorRecordStorage extends AggregatorStorage {
+ private static final String TAG = "AggregatorRecordStorage";
+ private String mTableName;
+ private List<String> mColumnNames;
+
+ public AggregatorRecordStorage(Context context, String tableName, String [] columnNames) {
+ if (columnNames.length < 1) {
+ throw new RuntimeException("No column keys");
+ }
+ mColumnNames = Arrays.asList(columnNames);
+ mTableName = tableName;
+
+ String tableCmd = "create table " + tableName + "( " + columnNames[0] +
+ " TEXT";
+ for (int i = 1; i < columnNames.length; ++i)
+ tableCmd = tableCmd + ", " + columnNames[i] + " TEXT";
+ tableCmd = tableCmd + ");";
+ Log.i(TAG, tableCmd);
+ try {
+ mDbHelper = new DBHelper(context, tableName, tableCmd);
+ mDatabase = mDbHelper.getWritableDatabase();
+ } catch (SQLException e) {
+ throw new RuntimeException("Can't open table: " + tableName);
+ }
+ }
+
+ // Adding one more row to the table.
+ // the data is a map of <column_name, value> pair.
+ public boolean addData(Map<String, String> data) {
+ ContentValues content = new ContentValues();
+ for (Map.Entry<String, String> item : data.entrySet()) {
+ content.put(item.getKey(), item.getValue());
+ }
+ long rowID =
+ mDatabase.insert(mTableName, null, content);
+ return rowID >= 0;
+ }
+
+ // Return all data as a list of Map.
+ // Notice that the column names are repeated for each row.
+ public List<Map<String, String>> getAllData() {
+ Cursor cursor = mDatabase.rawQuery("select * from " + mTableName + ";", null);
+ ArrayList<Map<String, String> > allData = new ArrayList<Map<String, String> >();
+ if (cursor == null) return allData;
+ cursor.moveToFirst();
+ do {
+ HashMap<String, String> oneRow = new HashMap<String, String>();
+ for (String column : mColumnNames) {
+ String value = cursor.getString(cursor.getColumnIndex(column));
+ oneRow.put(column, value);
+ }
+ allData.add(oneRow);
+ } while (cursor.moveToNext());
+ return allData;
+ }
+
+ // Empty the storage.
+ public int removeAllData() {
+ int nDeleteRows = mDatabase.delete(mTableName, "1", null);
+ Log.i(TAG, "Number of rows in table deleted: " + nDeleteRows);
+ return nDeleteRows;
+ }
+}
diff --git a/bordeaux/service/src/android/bordeaux/services/AggregatorStorage.java b/bordeaux/service/src/android/bordeaux/services/AggregatorStorage.java
new file mode 100644
index 000000000..1d8886e66
--- /dev/null
+++ b/bordeaux/service/src/android/bordeaux/services/AggregatorStorage.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bordeaux.services;
+
+import android.content.Context;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+
+// Base Helper class for aggregator storage database
+class AggregatorStorage {
+ private static final String TAG = "AggregatorStorage";
+ private static final String DATABASE_NAME = "aggregator";
+ private static final int DATABASE_VERSION = 1;
+
+ protected DBHelper mDbHelper;
+ protected SQLiteDatabase mDatabase;
+
+ class DBHelper extends SQLiteOpenHelper {
+ private String mTableCmd;
+ private String mTableName;
+ DBHelper(Context context, String tableName, String tableCmd) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ mTableName = tableName;
+ mTableCmd = tableCmd;
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL(mTableCmd);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ + newVersion + ", which will destroy all old data");
+
+ db.execSQL("DROP TABLE IF EXISTS " + mTableName);
+ onCreate(db);
+ }
+ }
+}
diff --git a/bordeaux/service/src/android/bordeaux/services/BordeauxService.java b/bordeaux/service/src/android/bordeaux/services/BordeauxService.java
index ab6f0f116..41ee11026 100644
--- a/bordeaux/service/src/android/bordeaux/services/BordeauxService.java
+++ b/bordeaux/service/src/android/bordeaux/services/BordeauxService.java
@@ -81,7 +81,6 @@ public class BordeauxService extends Service {
mAggregatorManager.registerAggregator(mMotionStatsAggregator, mAggregatorManager);
mAggregatorManager.registerAggregator(mLocationStatsAggregator, mAggregatorManager);
mAggregatorManager.registerAggregator(mTimeStatsAggregator, mAggregatorManager);
- //Log.i(TAG, "Bordeaux aggregators were registered");
// Display a notification about us starting.
// TODO: don't display the notification after the service is
diff --git a/bordeaux/service/src/android/bordeaux/services/BordeauxSessionStorage.java b/bordeaux/service/src/android/bordeaux/services/BordeauxSessionStorage.java
index 9979d84de..89c347204 100644
--- a/bordeaux/service/src/android/bordeaux/services/BordeauxSessionStorage.java
+++ b/bordeaux/service/src/android/bordeaux/services/BordeauxSessionStorage.java
@@ -133,6 +133,7 @@ class BordeauxSessionStorage {
void getAllSessions(ConcurrentHashMap<String, BordeauxSessionManager.Session> sessions) {
Cursor cursor = mDbSessions.rawQuery("select * from ?;", new String[]{SESSION_TABLE});
if (cursor == null) return;
+ cursor.moveToFirst();
do {
String key = cursor.getString(cursor.getColumnIndex(COLUMN_KEY));
BordeauxSessionManager.Session session = getSessionFromCursor(cursor);