12fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua/* 22fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * Copyright (C) 2012 The Android Open Source Project 32fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * 42fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * Licensed under the Apache License, Version 2.0 (the "License"); 52fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * you may not use this file except in compliance with the License. 62fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * You may obtain a copy of the License at 72fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * 82fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * http://www.apache.org/licenses/LICENSE-2.0 92fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * 102fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * Unless required by applicable law or agreed to in writing, software 112fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * distributed under the License is distributed on an "AS IS" BASIS, 122fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * See the License for the specific language governing permissions and 142fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * limitations under the License. 152fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua */ 162fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 172fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huapackage android.bordeaux.services; 182fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 192fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport android.content.ContentValues; 202fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport android.content.Context; 212fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport android.database.Cursor; 222fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport android.database.SQLException; 232fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport android.database.sqlite.SQLiteDatabase; 242fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport android.database.sqlite.SQLiteOpenHelper; 252fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport android.util.Log; 262fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 272fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport java.util.ArrayList; 282fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport java.util.Arrays; 292fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport java.util.HashMap; 302fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport java.util.List; 312fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaimport java.util.Map; 322fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 332fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua/* This class implements record like data storage for aggregator. 342fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * The data is stored in the sqlite database row by row without primary key, all 352fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * columns are assume having string value. 362fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * Sample usage: 372fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * AggregatorRecordStorage db = new AggregatorRecordStorage(this, "TestTable", 382fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * new String[]{"clusterid", "long", "lat"}); 392fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * db.removeAllData(); 402fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * HashMap<String, String> row = new HashMap<String, String>(); 412fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * row.put("clusterid", "home"); 422fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * row.put("long", "110.203"); 432fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * row.put("lat", "-13.787"); 442fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * db.addData(row); 452fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * row.put("clusterid", "office"); 462fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * row.put("long", "1.203"); 472fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * row.put("lat", "33.787"); 482fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * db.addData(row); 492fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * List<Map<String,String> > allData = db.getAllData(); 502fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua * Log.i(TAG,"Total data in database: " + allData.size()); 512fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua */ 522fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Huaclass AggregatorRecordStorage extends AggregatorStorage { 532fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua private static final String TAG = "AggregatorRecordStorage"; 542fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua private String mTableName; 552fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua private List<String> mColumnNames; 562fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 572fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua public AggregatorRecordStorage(Context context, String tableName, String [] columnNames) { 582fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua if (columnNames.length < 1) { 592fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua throw new RuntimeException("No column keys"); 602fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 612fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua mColumnNames = Arrays.asList(columnNames); 622fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua mTableName = tableName; 632fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 642fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua String tableCmd = "create table " + tableName + "( " + columnNames[0] + 652fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua " TEXT"; 662fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua for (int i = 1; i < columnNames.length; ++i) 672fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua tableCmd = tableCmd + ", " + columnNames[i] + " TEXT"; 682fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua tableCmd = tableCmd + ");"; 692fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua Log.i(TAG, tableCmd); 702fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua try { 712fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua mDbHelper = new DBHelper(context, tableName, tableCmd); 722fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua mDatabase = mDbHelper.getWritableDatabase(); 732fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } catch (SQLException e) { 742fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua throw new RuntimeException("Can't open table: " + tableName); 752fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 762fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 772fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 782fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua // Adding one more row to the table. 792fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua // the data is a map of <column_name, value> pair. 802fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua public boolean addData(Map<String, String> data) { 812fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua ContentValues content = new ContentValues(); 822fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua for (Map.Entry<String, String> item : data.entrySet()) { 832fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua content.put(item.getKey(), item.getValue()); 842fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 852fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua long rowID = 862fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua mDatabase.insert(mTableName, null, content); 872fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua return rowID >= 0; 882fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 892fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 902fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua // Return all data as a list of Map. 912fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua // Notice that the column names are repeated for each row. 922fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua public List<Map<String, String>> getAllData() { 932fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua ArrayList<Map<String, String> > allData = new ArrayList<Map<String, String> >(); 945d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin 955d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin Cursor cursor = mDatabase.rawQuery("select * from " + mTableName + ";", null); 965d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin if (cursor.getCount() == 0) { 975d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin return allData; 985d42ffa9462f87edbbdc61a8719f6c521c700de5Ruei-sung Lin } 992fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua cursor.moveToFirst(); 1002fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua do { 1012fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua HashMap<String, String> oneRow = new HashMap<String, String>(); 1022fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua for (String column : mColumnNames) { 10383954e853dc1e1a28b2c3efbe1585f188266df02Ruei-sung Lin int columnIndex = cursor.getColumnIndex(column); 10483954e853dc1e1a28b2c3efbe1585f188266df02Ruei-sung Lin if (!cursor.isNull(columnIndex)) { 10583954e853dc1e1a28b2c3efbe1585f188266df02Ruei-sung Lin String value = cursor.getString(columnIndex); 10683954e853dc1e1a28b2c3efbe1585f188266df02Ruei-sung Lin oneRow.put(column, value); 10783954e853dc1e1a28b2c3efbe1585f188266df02Ruei-sung Lin } 1082fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 1092fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua allData.add(oneRow); 1102fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } while (cursor.moveToNext()); 1112fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua return allData; 1122fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 1132fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua 1142fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua // Empty the storage. 1152fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua public int removeAllData() { 1162fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua int nDeleteRows = mDatabase.delete(mTableName, "1", null); 1172fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua Log.i(TAG, "Number of rows in table deleted: " + nDeleteRows); 1182fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua return nDeleteRows; 1192fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua } 1202fc454f62ff5e11eb16a93a3d515a4e4fba89b5eWei Hua} 121