blob: 647f638a6d7d55909f804421ebca3057bf9df19f [file] [log] [blame]
/*
* 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;
}
}