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