Android 中SQlite操作
一 Sqlite的特点:
1 轻量级的
进程内的数据库引擎,不存在数据库的客户端和服务器,非常小
2 不需要安装
Sqlite的核心引擎不需要依赖第三方软件,不需要安装
3 跨平台/可移植性
支持Windows、Linux、Unix等主流操作系统,
4 处理速度快
比起Mysql、PostgreSQL,处理速度快
5 开源
二 使用介绍
Android提供了创建和使用SQLite数据库的API。 SQLiteOpenHelper,这是一个辅助类,用来打开(创建)数据库,以及数据库升级,你需要创建它的子类,并且实现两个方法onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int)
SQLiteDatabase是一个数据库对象,提供了操作数据库的一些操作。
下面是一些常用的方法
1 openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)//打开或创建数据库
2 insert(Sting table,String nullColumnHack,CntentValues values)//插入一行数据
3 delete(String table,String whereClause,String[] whereArgs)//删除一行记录
4 query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)//查询一条记录
5 update(String table,ContentValues values,String whereClause,String[] whereArgs)//修改记录
6 close()关闭数据库
三 在项目中的具体使用情况
1 看懂数据库的内容和将其进行格式转换
所给文件为个gpsphone_Data.MDF和gpsphone_Log.LDF
SQL server 2000
主要数据文件(扩展名.mdf)
日志文件(扩展名.ldf)
SQL Server的每个数据库是以两个文件存放的,一个后缀名为mdf,是数据文件,另一个后缀名为ldf,为日志文件。因此只要定期复制这两个文件,就可以达到备份的效果。
下载安装 SQL server 2000将所给的数据以txt文件导出
下载 SQLiteManger 将上面的txt数据分表导入,保存成db格式
最后将db格式重命名为mp3 放入工程文件夹res/raw下,(在拷文件过程中,发现在部分AVD版本会出现buffer不够的问题,原因是db文件在拷贝过程中会被解压,从而占用内存,无法成功完成拷贝。后来的方案比较偏,通过将db文件重命名为mp3文件,然后拷为db文件。
很可行,mp3文件属于音频压缩格式,可以躲过android的解压过程。)
数据库的内容
分为这么几个表
road road_pile bridge department user
road (路的id 路的name)
road_pile (路桩的id 路桩的name 所在路的id 所在区的id 状态 精度 纬度 等 )
bridge(桥的id 桥的名字 所在的路的id 所在区的id 精度 纬度 状态)
department(id sup_id name)
sup_id=0 表示省
sup_id=1 表示市
是下面的县的sup_id 等于所在市的id
2 如何创建和使用表
1 创建两个类 DBCreate 和 DBHelper
DBCreate类用于创建数据库
public class DBCreater {
private final int BUFFER_SIZE = 40000;
public static final String PACKAGE_NAME = "com.nupt.less";
public static final String DB_PATH = "/data/data" + "/" + PACKAGE_NAME + "/" + "databases";
private static final String DB_NAME = "henan.db";
private SQLiteDatabase database;//成员变量
private Context context;//成员变量
public SQLiteDatabase getDataBase(){
return database;
}
DBCreater(Context context) { //构造函数
this.context = context;
}
public void openDatabase(){
this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
}
private SQLiteDatabase openDatabase(String dbfile) {
try {
File dir = new File(DB_PATH);
if (!dir.exists())
dir.mkdir();
if (!(new File(dbfile).exists())) {
InputStream is = this.context.getResources().openRawResource(R.raw.henan);
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
return db;
}catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
} catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
return null;
}
public void closeDatabase() {
this.database.close();
}
}
DBHelper类用于操作数据库
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "henan.db";
//String TBL_NAME ="GPS_DATA";
String TBL_NAME ="Road_Pile";
//private static final String CREATE_TBL = " create table " + " CollTbl(_id integer primary key autoincrement,name text,url text, desc text) ";
static SQLiteDatabase db;
public SQLiteDatabase getDb() {
return this.db;
}
DBHelper(Context c){
super(c, DB_NAME, null, 2);
}
public void onCreate (SQLiteDatabase db) {
this.db = db;
}
public Cursor query(){
SQLiteDatabase db = getWritableDatabase();
String selection = "_id>?";
String[] selectionArgs = {"19000"};
String[] colums = {"_id", "road_id", "field_id", "station", "country_name", "road_name"};
Cursor c = db.query(TBL_NAME, colums, selection, selectionArgs, null, null, null);
//Cursor c = db.query(TBL_NAME, null, selection, selectionArgs, null, null, null );
return c;
}
public Cursor query (String tableName, String selection, String[] selectionArgs){
SQLiteDatabase db = getWritableDatabase();
//String s = selection;
//String[] sArgs = selectionArgs;
Cursor c = db.query(tableName, null, selection , selectionArgs, null, null, null);
return c;
}
public Cursor query (String tableName, String[] colums, String selection, String[] selectionArgs){
SQLiteDatabase db = getWritableDatabase();
//String s = selection;
//String[] sArgs = selectionArgs;
Cursor c = db.query(tableName, colums, selection , selectionArgs, null, null, null);
return c;
}
public void close() {
if (db != null)
db.close();
}
public void update() {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("Station","啊");
String whereClause = "_id=?";
String[] whereArgs = {"12114"};
db.update(TBL_NAME, values, whereClause, whereArgs);
}
public void update(String tableName, ContentValues cv,String whereClause, String[] whereArgs){
SQLiteDatabase db = getWritableDatabase();
db.update(tableName, cv, whereClause, whereArgs);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
如果有其他的操作,删除什么也可以在这个类中添加内容。
这样将其封装在类中,只提供接口,数据使用更加安全,比起将sqliteDb设置为全局变量这种方法。
具体的使用方法:
在登录的activity中生成数据库
private dbCreater=new DBCreater(this);
dbCreater.openDatabase();
SQLiteDatabase sqlData=dbCreater.getDataBase();
这样sdcard中就有了这么一个数据库
查询的时候
举一个例子
Cursor cur1=null;
cur1 = dbhelper.query("Department", new String[]{"_id","dep_name","sup_dep_id"}, "sup_dep_id=?", new String[]{"1"});//查询表Department中的"_id","dep_name","sup_dep_id"这几列,条件是sup_dep_id=1。
更新的时候举一个例子
ContentValues cv = new ContentValues();
String whereClause = "_id=?";
String[] whereArgs = {a};
value = spinner.getSelectedItem().toString();//获取用户所选的值
Intent intent1 = getIntent();
string a = intent1.getStringExtra("ID");
cv.put("station", value);
cv.put("gran_time", granTime);
cv.put("checked", 1);
dbhelper.update("Bridge", cv, whereClause, whereArgs);
关闭操作
dbCreater.closeDatabase();