Android开发-从硬件到APP(十) : 数据库的读写
说好的写博客的事情又被搁浅了。真是~,每天光看星际老男孩的直播了,博客的事情被丢到了他奶奶家。现在终于回来写了,反正慢慢补吧,我也不知道能不能写到第十章,反正就这么起名字了。
高呼一声,干死黄旭东!!
其实android是有一个SQLiteOpenHelper类来操作数据库的,不过限制多多(比如不能保存在SD卡中),而且对于学习SQL语句也没什么帮助,所以还是打算自己写一个类来操作数据库。鉴于我的数据库结构已经确定了,而且不会更改数据库里面的数据,所以就不重写update的方法了。。。。
我目前的项目是一个传感器采集的项目,涉及的气体有CH4,CO,O2,NO2。大体的就是这样了。
1.插入数据我的表中有:id:主键,自增的。gas_type:气体类型gas_original_value:采集气体原始数据gas_valtage_value:转换后的电压值gas_actual_value: 表示气体浓度的实际值templeture: 采集数据时的温度值system_date: 采集数据时的系统时间
我的这些方法全是写在一个Databaes的类中。所以使用的时候可以这样
DataBase database = new DataBase();
for(int i = 0;i<2000;i++)
database.insertData("xxx.db3", "o2", 1234, 2.123, 1234.12354, i, date.getSystemDate());
/**向一个表中插入数据,如果该表不存在,则创建他*/
public void insertData(String databaseFile ,String gas_type , int gas_original_value
,double gas_valtage_value,double gas_actual_value,int templeture ,String system_date)
{
SQLiteDatabase db;
db = SQLiteDatabase.openOrCreateDatabase("/sdcard/MultGasDetecter/database/"+databaseFile,null);
try
{
db.execSQL("insert into gas_data values(null, ? , ? , ? , ? , ? , ?)"
,new String[]{gas_type , gas_original_value+"",gas_valtage_value+"",gas_actual_value+""
,templeture+"",system_date+""});
}
catch(SQLiteException e2)
{
db.execSQL("create table gas_data(id integer primary key autoincrement,"
+" gas_type varchar(30),"
+" gas_original_value integer,"
+" gas_valtage_value double precision,"
+" gas_actual_value double precision,"
+" templeture integer,"
+" system_date varchar(30))");
db.execSQL("insert into gas_data values(null, ? , ? , ? , ? , ? , ?)"
,new String[]{gas_type , gas_original_value+"",gas_valtage_value+"",gas_actual_value+""
,templeture+"",system_date+""});
e2.printStackTrace();
}
debug("insertData");
if((db != null)&&db.isOpen())
{
db.close();
}
}
2. 查询数据:注释写的够清晰了吧。。。。返回的数据全部都是string型的使用的方法已经写在注释中的eg:里了!
* 查询数据库中的某张表中的某列数据
* File:
* 数据库文件名称,路径统一保存到/sdcard/MultGasDetecter/database/下
* table:
* 要查询的数据库表名
* columnName:
* 要查询的数据库的列名
*
* 输入项为:
* id
* gas_type
* gas_original_value
* gas_valtage_value
* gas_actual_value
* templeture
* system_dat
*
* eg::
* Database database = new Database();
* int len = database.queryDataByColumnName("test.db3","gas_data","gas_type").length;
* debug("len = "+len);
* String[] string = new String[len];
* string = database.queryDataByColumnName("test.db3","gas_data","gas_type");
*
* for(int i = 0 ; i< len-1 ; i++)
* {
* debug(string[i]);
* }
*
* */
public String[] queryData(String file,String table,String columnName,String begin_time ,String end_time)
{
String sqlQuery ;
int m = 0;
CharArrayBuffer array = new CharArrayBuffer(128);
SQLiteDatabase db;
db = SQLiteDatabase.openOrCreateDatabase("/sdcard/MultGasDetecter/database/"+file,null);
if((begin_time!=null)&&(end_time!=null))
{
sqlQuery = "select * from "+table+" where system_date>='"+begin_time+"' and system_date<='"+end_time+"';";
}
else
sqlQuery = "select * from "+table+";";
Cursor result = db.rawQuery(sqlQuery, null);
debug("getColumnCount = "+result.getCount());
String[] string = new String[result.getCount()];
result.moveToFirst();
if(columnName != null)
{
while(!result.isAfterLast())
{
try
{
// debug("copyStringToBuffer");
string[m]="";
if(columnName.indexOf("id")!= -1)
{
result.copyStringToBuffer(0, array);
string[m]+=getStringFromCharArrayBuffer(array);
}
if(columnName.indexOf("gas_type")!= -1)
{
result.copyStringToBuffer(1, array);
string[m]+=getStringFromCharArrayBuffer(array);
}
if(columnName.indexOf("gas_original_value")!= -1)
{
result.copyStringToBuffer(2, array);
string[m]+=getStringFromCharArrayBuffer(array);
}
if(columnName.indexOf("gas_valtage_value")!= -1)
{
result.copyStringToBuffer(3, array);
string[m]+=getStringFromCharArrayBuffer(array);
}
if(columnName.indexOf("gas_actual_value")!= -1)
{
result.copyStringToBuffer(4, array);
string[m]+=getStringFromCharArrayBuffer(array);
}
if(columnName.indexOf("templeture")!= -1)
{
result.copyStringToBuffer(5, array);
string[m]+=getStringFromCharArrayBuffer(array);
}
if(columnName.indexOf("system_dat")!= -1)
{
result.copyStringToBuffer(6, array);
string[m]+=getStringFromCharArrayBuffer(array);
}
// debug(string[m]);
m++;
result.moveToNext();
}
catch(SQLiteException e)
{
debug("copy string error");
e.printStackTrace();
}
}
}
else
debug("没有输入columnName");
result.close();
db.close();
return string;
}
/**
* 根据时间查询数据库中的所有列中的数据
* */
public String[] queryDataByDate(String file,String table,String begin_time ,String end_time)
{
return queryData( file, table, "id gas_type gas_original_value gas_valtage_value gas_actual_value templeture system_dat", begin_time , end_time);
}
public String[] queryDataByColumnName(String file,String table,String columnName)
{
return queryData( file, table, "columnName", null , null);
}
private String getStringFromCharArrayBuffer(CharArrayBuffer array)
{
int i;
String string = null;
// debug("array.sizeCopied = "+array.sizeCopied);
string = "";
for(i=0;i<array.sizeCopied;i++)
{
// debug(""+(char)array.data[i]);
string += array.data[i]+"";
}
string += " ";
return string;
}
public String[] queryDataByColumnName(String file,String table,String columnName)
{
return queryData( file, table, "columnName", null , null);
}
private String getStringFromCharArrayBuffer(CharArrayBuffer array)
{
int i;
String string = null;
// debug("array.sizeCopied = "+array.sizeCopied);
string = "";
for(i=0;i<array.sizeCopied;i++)
{
// debug(""+(char)array.data[i]);
string += array.data[i]+"";
}
string += " ";
return string;
}
3 . 删除数据 如此清晰,不用我再注释了吧!!
* 删除时间间隔内数据库中的数据
* 返回值:
* -1 输入有误
* 0 删除成功
* -2 删除失败,抛出异常
*
* eg: database.deleteDataByDate("xxx.db3","gas_data","2014-07-21 11:36:57","2014-07-21 11:39:07");
* **/
public int deleteDataByDate(String file,String table ,String begin_time ,String end_time)
{
if((begin_time!=null)&&(end_time!=null))
{
SQLiteDatabase db;
db = SQLiteDatabase.openOrCreateDatabase("/sdcard/MultGasDetecter/database/"+file,null);
try
{
db.execSQL("delete from "+table+" where system_date>='"+begin_time+"' and system_date<='"+end_time+"';");
}
catch(SQLiteException e)
{
debug("delete database error");
e.printStackTrace();
return -2;
}
db.close();
return 0;
}
else
return -1;
}
/**
* 删除某时间以后数据库中的数据
* 返回值:
* -1 输入有误
* 0 删除成功
* -2 删除失败,抛出异常
*
* eg: database.deleteDataAfterDate("xxx.db3","gas_data","2014-07-21 11:39:38");
* **/
public int deleteDataAfterDate(String file,String table ,String begin_time)
{
if(begin_time == null)
return -1;
else
{
SQLiteDatabase db;
db = SQLiteDatabase.openOrCreateDatabase("/sdcard/MultGasDetecter/database/"+file,null);
try
{
db.execSQL("delete from "+table+" where system_date>'"+begin_time+"';");
}
catch(SQLiteException e)
{
debug("delete database error");
e.printStackTrace();
return -2;
}
db.close();
return 0;
}
}
/**
* 删除某时间以前数据库中的数据
* 返回值:
* -1 输入有误
* 0 删除成功
* -2 删除失败,抛出异常
*
* eg: database.deleteDataBeforeDate("xxx.db3","gas_data","2014-07-21 11:39:10");
* **/
public int deleteDataBeforeDate(String file,String table ,String begin_time)
{
if(begin_time == null)
return -1;
else
{
SQLiteDatabase db;
db = SQLiteDatabase.openOrCreateDatabase("/sdcard/MultGasDetecter/database/"+file,null);
try
{
db.execSQL("delete from "+table+" where system_date<'"+begin_time+"';");
}
catch(SQLiteException e)
{
debug("delete database error");
e.printStackTrace();
return -2;
}
db.close();
return 0;
}
}