1.SQLite概述
SQLite是一款轻量级的关系型数据库,由于它占用的资源非常少,所以在很多嵌入式设备都是用SQLite来存储数据。Android作为目前主流的移动操作系统,完全符合SQLite占用资源少的优势,故在Android平台上,集成了一个嵌入式关系型数据库SQLite。
继承SQLiteOpenHelper类,同时覆盖onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和定义构造函数,使用该类实例对象的getReadableDatabase()或者getWritableDatabase()得到当前数据库的实例化对象,可直接对其进行操作
2.SQLite实现增删改查
[java]view plaincopy
-
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- DbOpenHelperdbOpenHelper=newDbOpenHelper(this,"mytest.db",1);
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- //////////////////////////////////////////////////////////
- db.execSQL("insertintouser(name,age)values(?,?)",newObject[]{"zhang",0)">10});
- db.execSQL("deletefromuserwhere_id=?",153); font-weight:bold">newString[]{"1"});
- db.execSQL("updateusersetname=?where_id=?",153); font-weight:bold">newString[]{"haha","2"});
- Cursorcursor=db.rawQuery("select*fromuserwhereage>=?",0)">//1.4查
- while(cursor.moveToNext()){
- Toast.makeText(1),Toast.LENGTH_SHORT).show();
- }
- ContentValuesvalues=newContentValues();
- values.put("name","John");
- values.put("age",0)">20);
- db.insert("user",
- "name",0)">//StringnullColumnHack
- //SQl不允许插入一个空行,当values的值为空时,将相当于执行于
- //insertintoage(name)values("null");
- values);
- db.delete("user","age>=?andage<=?",153); font-weight:bold">newString[]{"12","18"});
- ContentValuesvalues1=//2.3改
- "liu");
- db.update("user",values1,"_id=?",153); font-weight:bold">newString[]{"8"});
- Cursorcursor1=db.query("user",0)">//表格名//2.4查
- null,0)">//String[]columns如果为空,则返回所有列
- "age>=?",0)">//Stringselection查询条件
- newString[]{"15"},0)">//String[]selectionArgs查询参数
- //StringgroupBy
- //Stringhaving
- null);
- while(cursor.moveToNext()){
- intid=cursor1.getInt(cursor1.getColumnIndex("_id"));
- "name")),255)">}
/**
- *DbOpenHelper.java
- */
- importandroid.content.Context;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.database.sqlite.SQLiteOpenHelper;
- publicclassDbOpenHelperextendsSQLiteOpenHelper{
- publicDbOpenHelper(Contextcontext,Stringname,153); font-weight:bold">intversion){
- super(context,name,version);
- /**
- *数据库只有在第一次创建时才调用该方法,对于一个已经存在的数据库,该方法不执行
- *SQLiteDatabase.openOrCreateDatabase()
- voidonCreate(SQLiteDatabasedb){
- Stringsql="createtableuser(_idintegerprimarykeyautoincrement,namevarchar(10),ageinteger)";
- db.execSQL(sql);
- *只有当数据库的版本号增加时,才会执行到该函数
- *初始默认数据库版本为0,当构造函数传递newVersion时,这时会有db.getVersion()与newVersion比较觉得该函数是否执行
- voidonUpgrade(SQLiteDatabasedb,153); font-weight:bold">intoldVersion,153); font-weight:bold">intnewVersion){
- }
3.getReadableDatabase()和getWritableDatabase()区别
(1).getReadableDatabase()
使用SQLiteDatabase实例对象的getReadableDatabase()方法,首先会检查数据库是否已经实例化并处于打开状态,如果满足要求直接返回数据库对象,否则试图返回一个可读写模式的数据库,但当磁盘空间已满,只能得到只读模式数据库对象
(2).getWritableDatabase()
使用SQLiteDatabase实例对象的getWritableDatabase()方法,目的是得到一个具有可读写的数据库实例对象,首先判断mDatabase是否不为空且已打开且不是只读模式,则直接返回该实例对象,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,进行版本相关操作并解锁,最后返回数据库实例对象!
总之,一般情况下,通过这两种方法获得的数据库实例对象时一样的,只有在数据库空间已满或其它情况下,通过getReadableDatabase得到的才是只读的实例对象
//得到一个具有可读写的数据库实例对象
- synchronizedSQLiteDatabasegetWritableDatabase(){
- if(mDatabase!=null&&mDatabase.isOpen()&&!mDatabase.isReadOnly()){
- returnmDatabase;
- }
- if(mIsInitializing){
- thrownewIllegalStateException("getWritableDatabasecalledrecursively");
- booleansuccess=false;
- SQLiteDatabasedb=null;
- null)
- mDatabase.lock();
- try{
- mIsInitializing=true;
- if(mName==null){
- db=SQLiteDatabase.create(null);
- }else{
- db=mContext.openOrCreateDatabase(mName,0,mFactory);
- intversion=db.getVersion();
- if(version!=mNewVersion){
- db.beginTransaction();
- if(version==0){
- onCreate(db);
- else{
- onUpgrade(db,version,mNewVersion);
- db.setVersion(mNewVersion);
- db.setTransactionSuccessful();
- finally{
- db.endTransaction();
- onOpen(db);
- success=true;
- returndb;
- false;
- if(success){
- null){
- mDatabase.close();
- catch(Exceptione){
- mDatabase.unlock();
- mDatabase=db;
- mDatabase.unlock();
- if(db!=db.close();
-
/*
- *在getReadableDatabase()方法中,首先检查数据库是否已经实例化并处于打开状态
- *如果满足要求直接返回数据库对象,否则试图获取一个可读写模式的数据库实例;
- *当磁盘空间已满,再以只读模式打开数据库
- synchronizedSQLiteDatabasegetReadableDatabase(){
- null&&mDatabase.isOpen()){
- //如果发现mDatabase存在并已打开,则直接返回该数据库对象
- //检查数据库是否正在进行初始化操作
- newIllegalStateException("初始化");
- /******注意!!!调用了getWritableDatabase()方法*****/
- returngetWritableDatabase();
- catch(SQLiteExceptione){
- throwe;
- *使用可读写不能得到数据库对象,下面的操作只能得到对对象
- *常见数据库已满,不能再添加数据,此时只能写,不能读
- */
- null;
- try{
- Stringpath=mContext.getDatabasePath(mName).getPath();
- db=SQLiteDatabase.openDatabase(path,mFactory,SQLiteDatabase.OPEN_READONLY);
- if(db.getVersion()!=mNewVersion){
- newSQLiteException("Can'tupgraderead-onlydatabasefromversion"+db.getVersion()+"to"
- +mNewVersion+":"+path);
- Log.w(TAG,"Opened"+mName+"inread-onlymode");
- mDatabase=db;
- returnmDatabase;
- finally{
- false;
- null&&db!=mDatabase)
- db.close();
- 4.Cursor对象
(1).主要方法
c.move(intoffset);
- c.moveToFirst();
- c.moveToLast();
- c.moveToPosition(intposition);
- c.moveToPrevious();
- c.moveToNext();
- c.isFirst();
- c.isLast();
- c.isBeforeFirst();
- c.isAfterLast();
- c.isNull(intcolumnIndex);
- c.isClosed();
- c.getCount();
- c.getPosition();
- c.getColumnIndex(StringcolumnName);
- c.getString(//返回当前行指定列的值
(2).Cursor对象的管理
Activity提供了LoaderManager去管理cursor的生命周期,可参考cursor管理>>
(3).Cursor注意情况
1).要求
需要注意的是,在cursor的结果集中必须要包含一个“_id”的列,否则SimpleCursorAdapter会不识别,因为这源于SQLite的规范,主键以“_id”为标准。
2).措施
第一,建表时根据规范去做; 第二,查询时用别名,例如:SELECT id AS _id FROM person; 第三,使用CursorWrapper
- CursorWrappercursorWrapper=newCursorWrapper(c){
- @Override
- intgetColumnIndexOrThrow(StringcolumnName)throwsIllegalArgumentException{
- if(columnName.equals("_id")){
- returnsuper.getColumnIndex("id");
- }
- super.getColumnIndexOrThrow(columnName);
- }
5.防止数据重复插入
@Override
- voidonCreate(SQLiteDatabasedb){
- Stringsql="createtablebitmap("+
- "_idintegerprimarykeyautoincrement,"+
- *防止重复,如果发现重复,数据不能添加
- *fileNamevarchar(100)UNIQUE
- *
- *如果是下面这样声明,重复冲突后,原有的数据将会被替换
- *fileNamevarchar(100)UNIQUEONCONFLICTREPLACE
- "fileNamevarchar(100)UNIQUE,255)">"latitudevarchar(100),"+
- "longitudevarchar(100),255)">"addrvarchar(100),255)">"isSavedinteger,255)">"modelvarchar(100))";
- db.execSQL(sql);
- 6.事务Transacation
//数据库事务
- voiddbTransacation(){
- //开始事务
- {
- //多个sql执行语句
- //设置事务成功完成,将缓冲区的数据提交
- 7.关于CursorIndexOutOfBoundsException
在使用SQLiteDatabase.openOrCreateDatabase()去打开一个sdcard上的db文件时,此时光标应该移动为记录的最后,如果没有使用cursor.moveToFirst(),就会报该异常,所有任何游标使用时,应该先moveToFirst()
if(cursor!=null&&cursor.getCount()>0){
- cursor.moveToFirst();
- intindexTrainsetType=cursor.getColumnIndex(TrainsetTypeMetaDate.trainsetType);
- do{
- StringtrainsetType=cursor.getString(indexTrainsetType);
- list.add(trainsetType);
- while(cursor.moveToNext());
- }
8.SQLITE分页查询
//方法一:select*fromtable_namewhereid>7limit10offset3;
- limit10offset3;
- //方法二:select*fromtable_namewhereid>7limit3,10;
- 3,0)">10;
9.Update or Replace
<code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas,serif; white-space: inherit; background-color: rgb(255,255);"><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">INSERT</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> </span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">OR</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> REPLACE </span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">INTO</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> Employee </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">(</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">id</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> name</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> role</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">)</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">
</span><span class="kwd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0,139); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">VALUES</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> </span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">(</span><span class="lit" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128,0); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">1</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,</span><span class="pln" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"> </span><span class="str" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128,0); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">'John Foo'</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">,0); background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">'CEO'</span><span class="pun" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">);</span></code>
BAD: This will insert or replace 2 of the columns... the NAME column will be set to NULL or the default value:
GOOD: This will update 2 of the columns. When ID=1 exists,the NAME will be unaffected. When ID=1 does not exist,the name will be default (NULL).
This will update 2 of the columns. When ID=1 exists,the ROLE will be unaffected. When ID=1 does not exist,the role will be set to 'Benchwarmer' instead of the default value.
10.Replace部分字符串
You can use the built inreplace() function to perform a string replace in a query.
Other string manipulation functions (and more) are detailed in theSQLite core functions list
The following should point you in the right direction.
UPDATE table SET field = replace( field,'C:afolder','C:anewfolder' ) WHERE field LIKE 'C:afolder%'
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|