android SQLite操作

在程序里面需要保存很多正常人脑袋都记不住的很多数据的时候,正常人都会想用到一个可以帮我们记忆数据的工具,毫无疑问数据库在此时显得尤为重要。android里面集成了sqlite数据库,很多桌面程序都是用的sqlite,比如firefox的数据库,主要因为体积小,这里说的小是跟微软的sql和orcal比较。
建库建表的过程:继承自SQLiteOpenHelper这个类,名字很形象,数据库的帮助类,意思就是这个类会帮你做一些事情,如果想自己动手最好的办法是去读源码。访问sqlite有很多种方法,这里只是其中一种。
做个最简单的例子:一个Activity一个DB。先贴源码再解释。
DB类

package opq.database;
import java.util.ArrayList;
import java.util.List;
import opq.entity.StuEntity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DbHelperAdapter {
public static final String DB_NAME = "test.db";//数据库名
public static final String TB_NAME = "tbl_stuInfo";//表名

//字段名
public static final String STU_ID = "_id";
public static final String STUNAME = "stuName";//学生姓名
public static final String STUSEX="stuSex";//学生性别
public static final String STUAGE="stuAge";//学生年龄


Context context;//上下文对象
private TestHelper tHelper;//帮助类
private SQLiteDatabase db;//数据库对象

public DbHelperAdapter(Context context){
this.context=context;
}

/**
* 打开数据库连接
* @return
*/
public DbHelperAdapter open(){
tHelper = new TestHelper(context);
db = tHelper.getWritableDatabase();
return this;
}
/**
* 关闭连接
*/
public void close(){
tHelper.close();
}

/**
* 插入数据
* @param stu实体类
* @return
*/
public long create(StuEntity stu){
ContentValues cv = new ContentValues();
cv.put(STUNAME,stu.getStuName());
cv.put(STUSEX,stu.getStuSex());
cv.put(STUAGE,stu.getStuAge());
return db.insert(TB_NAME, null, cv);
}

/**
* 删除
* @param stu
*/
public void delete(StuEntity stu){
db.delete(TB_NAME, STU_ID +"="+stu.getStuId() , null);
}

/**
* 更新 整行数据
* @param stu
*/
public void update(StuEntity stu){
ContentValues cv = new ContentValues();
cv.put(STUNAME,stu.getStuName());
cv.put(STUSEX ,stu.getStuSex());
cv.put(STUAGE,stu.getStuAge());
db.update(TB_NAME, cv, STU_ID+"="+stu.getStuId(), null);
/*最后一个为null 所以是更新整行数据,*/
}
/**
* 更新单个
* @param strTime
*/
public void updateTime(String strTime){
ContentValues cv = new ContentValues();
cv.put(STUNAME,"yyy");
db.update(TB_NAME, cv,STU_ID+"=?", new String[] { "0" });
}

/**
* 查询全部
* @return
*/
public List<StuEntity> getAll(){
String[] col = {STU_ID, STUNAME , STUSEX,STUAGE};
Cursor cursor = db.query(TB_NAME, col, null, null, null, null, null);
List<StuEntity> list = new ArrayList<StuEntity>();

if (cursor.moveToFirst()) {
do {
StuEntity stu = new StuEntity();
stu.setStuId(Integer.valueOf(cursor.getString(0)));
stu.setStuName(cursor.getString(1));
stu.setStuSex(cursor.getString(2));
stu.setStuAge(Integer.valueOf(cursor.getString(3)));
list.add(stu);
}while (cursor.moveToNext());
}
return list;
}
/*数据库帮助类 内部类*/
public static class TestHelper extends SQLiteOpenHelper{
public TestHelper(Context context){
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Log.d("TAG","sqliteHelper onCreate");
String CREATE_TABLE ="create table " +TB_NAME +
"( " +
STU_ID+ " integer primary key AUTOINCREMENT,"+
STUNAME+ " text not null,"+
STUSEX+" text not null," +
STUAGE+" int not null "+
")";
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("drop table if exists "+TB_NAME);
onCreate(db);
Log.d("TAG","sqliteHelper onUpgrade");
}
}
}

Activity类

package opq.testdb;

import opq.database.DbHelperAdapter;
import opq.entity.StuEntity;
import android.app.Activity;
import android.os.Bundle;

public class TestdbActivity extends Activity {
DbHelperAdapter dbHelperAdapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dbHelperAdapter=new DbHelperAdapter(this);
StuEntity stu=new StuEntity();
stu.setStuAge(10);
stu.setStuName("asdf");
stu.setStuSex("xx");
dbHelperAdapter.open();
dbHelperAdapter.create(stu);
dbHelperAdapter.close();
}
}

运行该工程文件,就已经创建好了一张表,问题也就随之而来了,怎么知道表已经创建好了呢。先找到点成就感才有兴趣继续玩下去。
cmd之前先确定模拟器已经启动了,如果模拟器没启动 cmd--adb shell报个什么错忘记了。
打开cmd,敲如下命令行:adb shell ,如果回车以后看到的是什么内部外部命令的错误信息,则打开android-skd 目录,在platform-tools目录下面找个这么个东西,adb.exe的可运行文件,找到以后把文件路径地址复制到 环境变量PATH里面,这是本人的PATH值 仅供参考:C:\Program Files\Java\jdk1.6.0_26\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Windows7Master;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;D:\Android\android-sdk\platform-tools
传说adb.exe这个文件不在platform-tools就在platform里面,如果俩文件夹里面都没有,自己去重新下载android的SDK。
继续cmd,adb shell以后,敲的所有命令都是linux的,在这个项目里面,敲这样的:
cd data/data/opq.testdb/databases 回车 中间的opq.testdb是自己定义的包名。这个包名是有意思的,应该写当时创建Android工程项目的时候,都会自动建立一个Activity,cd data/data/(包名)/databases (包名)=自动建立的Activity所在的包名,因为所有的Android 的程序都是独立的,包括所有的数据也是独立的,不能互相访问,数据库文件必须依托程序而存在,一个sqlite数据库文件对应一个程序,体会一下区别:在java web里面 多个工程可以共用一个sql或者orcal的同一个表空间,在android里面搞同样的事情结果不怎么样只是会报错。
ls -l 回车
如果什么都没看到,那是不可能的,正常情况下,会有一个叫做,test.db的文件,这个就是在数据库操作类里面定义的DB_NAME值,继续敲命令:sqlite3 test.db 如果是命令是正确的,最开始的 # 会变成这样:sqlite> ,敲命令行: .tables tables前面还有个点啊。火车以后会看到至少一张表名:android_metadata 还有一张是自己创建的表名:TB_NAME所指定的值,从这里以后,接下来的操作都跟sql orcal mysql里面的操作一样了,增删改查的语句大同小异。
开始说SQLiteOpenHelper这个类会帮我们做一些事情,创建这个类以后,它会自动去判断我们指定的数据库文件存不存在,如果存在了则不会去调用onCreate方法,如果数据库文件不存在先建库再调用onCreate方法,在onCreate方法里面写的都是创建表的语句,还有一个 onUpgrade 方法,这个方法本人压根就没发现它被调用过,虽然同样是必须实现的父类方法。
每次打开数据库连接以后记得关闭连接,就是 open 和 close 必须成对的出现,最后 have fun
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值