`
veryEdu
  • 浏览: 17556 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

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
分享到:
评论
1 楼 awp258 2011-12-08  
谢谢,能发个源码吗?

相关推荐

Global site tag (gtag.js) - Google Analytics