SQLite 数据库

来源:互联网 发布:如何提高反应速度知乎 编辑:程序博客网 时间:2024/05/02 22:21

Android系统集成了一个轻量级的数据库:SQLite,它只是一个嵌入式的数据库,专门适用于资源有限的设备(如手机、PDA等)从本质上来看,SQLite的操作方式只是一种更为便捷的文件操作。
SQLiteDatabase简介:
Android 提供了SQLiteDatabase代表一个数据库(底层就是一个数据库),一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可通过就可通过SQLiteDatabase对象来管理、操作数据库了
SQLiteDatabase提供了如下静态方法打开一个文件对应的数据库、

1)、static SQLiteDatabase openDatabase (String path,SQLiteDatabase.CursorFactory factory,int flags):打开path文件所代表的SQLite数据库
2、 static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory):打开或创建(如果文件不存在)file文件所代表的SQLite的数据库
3、 static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory):打开或创建(如果不存在)path文件所代表的SQLite数据库
在程序中获取了SQLiteDatabase对象之后接下来就可以调用SQLiteDatabase的如下方法来操作数据库了:
1、execSQL(String sql,Object[] bindArgs):执行待占位符的SQL语句
2、execSQL(String sql):执行SQL语句
3、insert(String table,String nullColumnHack, ContentValues values):向指定表中插入数据
4、update(String table,ContentValues values,String whereClause,String[] whereArgs):更新指定表中的特定数据
5、delete(String table,String whereClause,String[] whereArgs):删除指定表中的数据
6、Cursor query(String table, String[] columns,String whereClause,String[] whereArgs,String groupBy,String having,String orderBy):对指定数据表执行查询
7、Cursor query(String table,String[] columns,String whereClause,String[] whereArgs,String groupBy,String having,String orderBy,String limit):对指定的数据表执行查询。limit 参数控制最多查询几条记录(用于控制分页的参数)
8、Cursor query (boolean distinct,String table,String[] columns,String whereClause,String[] whereArgs,String groupBy,String having,String orderBy,String limit):对指定数据表执行查询。其中第一个参数控制是否去掉重复值
9、rawQuery(String sql,String[] selectionArgs):执行带占位符的SQL查询
10、beginTransaction():开始事物
11、endTransaction():结束事物
Cursor 对象常用方法:(提供如下方法来移动查询结果的记录指针)
move(int offset):将记录指针向上或向下移动指定的行数,offset为正数就是向下移动,为负数就是向上移动、
boolean moveToFirst():将记录移动到第一行,如果移动成功则返回true
boolean moveToLast():将记录移动到最后一行,如果移动成功则返回true
boolean moveToNext():将记录移动到下一行,如果移动成功则返回true
boolean moveToPosition(int position):将记录移动到指定行,如果移动成功则返回true
boolean moveToPrevious():将记录移动到上一行,如果移动成功则返回true
一旦将记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取该行的指定列的数据

创建数据库和表、
例如下面代码:
SQLiteDatabase.openOrCreateDatabase(“/mnt/db/temp.db3”,null);
总结起来,使用SQLiteDatabase进行数据库操作的步骤如下:
1、获取SQLiteDatabase对象,他代表了与数据库的链接
2、调用SQLiteDatabase的方法来执行SQL语句。
3、操作SQL语句的执行效果,比如用SimpleCursorAdapter封装Cursor.
4、关闭SQLiteDatabase,回收资源。
在本地查看数据库步骤:
1、adb shell
2、cd data/data/
3、cd 对应的文件下
4、sqlite3 my.db3:sqlite3 相应的数据库
5、.tables
6、.schema 表明 查询建表的语句
7、select * from 表的名字;

SQLiteOpenHelper 是安卓提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。一般用发是创建SQLiteOpenHelper的子类,并扩展了它的oncreate(SQLiteDatabase db )和onUpgrade(SQLiteDatabase db ,int oldVersion,int newVersion)方法;
SQLiteOpenHelper包含如下常用的方法:
synchronized SQLiteDatabase getReadableDatabase():以读写的方式打开数据库对应的SQLiteDatabase对象。
synchronized SQLiteDatabase getWriteableDatabase():以写的方式打开数据库对应的SQLiteDatabase对象。
abstract void onCreate(SQLiteDatabase db ):当第一次创建数据库的时候回调该方法
abstact void onUpgrade(SQLiteDatabase db ,int oldVersion ,int newVersion):当数据库版本更新时回调该方法
synchronized void close(): 关闭所有打开的SQLiteDatabase对象

开发者需要做的就是重写它的两个抽象方法:
oncreate(SQLiteDatabase db) :用于初次使用软件时生成数据库表。
onUpgrade(SQLiteDatabase db ,int oldVersion,int newVersion):用于升级软件时更新数据库表结构,此方法在数据库的版本发生变化是辉被调用,该方法调用时oldVersion代表数据库之前的版本号,newVersion代表数据库当前的版本号。
一旦得到了SQLiteOpenHelper对象之后,程序无须使用SQLiteDatabase的静态方法创建SQLiteDatabase实例,而且可以使用getReadableDatabase()或getWriteableDatabase()方法来获取一个用于操作数据库的SQLiteDatabase实例,
这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象,不同的是当数据库不可写入的时候(如磁盘控件已满)getReadableDatabase()方法返回的对象将以只读的方式打开数据库,而getWriteableDatabase()放发则会出现异常。
SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少的那个构造方法即可,这个构造方法有四个参数:MydatabaseHelper(Context context, String name,CursorFactory factory, int version) {}
第一个、context 上下文,第二个:数据库的名,第三个:允许我们在查询的时候返回一个自定义的Cursor,一般都是传入null,第四个:当前数据库的版本号,可用于对数据库进行操作。
当调用了getReadableDatabase()或者getWriteableDatabase()方法后,数据库,以及里边的表都会创建成功,
public class MydatabaseHelper extends SQLiteOpenHelper {
final String cREATE_TABLE_SQL =”create table dict(_id integer primary “+”key autoincrement , word ,detail )”;
public MydatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}

@Overridepublic void onCreate(SQLiteDatabase arg0) {    // TODO Auto-generated method stub    //第一次使用数据库时自动建表    Log.i("zhaoyi88888","00000000");     arg0.execSQL(cREATE_TABLE_SQL);}@Overridepublic void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {    // TODO Auto-generated method stub}

}

public class MainActivity extends Activity {
MydatabaseHelper dbHelper;
Button insert=null;
Button search=null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建MyDatabaseHelper()对象,指定版本号为1,此处使用相对路径即可,;
//数据库文件会自动保存在程序的数据文件的databases目录下
dbHelper=new MydatabaseHelper(this, “zhaoyi.db”, null, 1);
insert=(Button) findViewById(R.id.insert);
search=(Button) findViewById(R.id.search);
insert.setOnClickListener(new OnClickListener() {

        @Override        public void onClick(View arg0) {            // TODO Auto-generated method stub           //插入生词记录            dbHelper.getWritableDatabase();        }    });}

当创建成功之后,想看是否数据库是否真实存在,因此,来看一种查看方式:
使用adb shell来对数据库和表的创建情况进行检查;
adb 是Android SDK中自带的一个调试工具,使用这个工具可以对手机或模拟器进行调试操作,它存放在sdk的platform-tools目录下,如果想要在命令行中使用这个工具,就需要先把它的路径配置到环境变量里,如果你使用的是Windows系统,可以右击我的电脑–>属性–>高级–>环境变量,然后在系统变量里找到Path并点击编辑,将platform-tools目录配置进去即可。
当调用了getReadableDatabase()或者getWriteableDatabase()方法后,可以用于创建和更新数据库,不仅如此这两个方法还会返回一个SQLiteDatabase对象,借助这个对象我们就可以对数据库,进行增删改查。
1、添加数据:SQLiteDatabase提供了, insert()方法,专门用于添加数据,它接受三个参数:第一个:是表的名,第二个:用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般我们用不到这个功能,直接传入null 即可。第三个参数:是一个ContentValues对象,它提供了一系列的put()方法重载。用于向ContentValues中添加数据,只需要将表中的每个列明以及相应的待添加数据传入即可。
SQLiteDatabase db= dbHelper.getWritableDatabase();
ContentValues values= new ContentValues();
//开始组装第一条数据
values.put(“word”,”123”);
values.put(“detail”, “45666”);
db.insert(“dict”, null, values);
2、更新数据库:update():这个方法有四个参数:第一个参数是表名,第二个参数:是ContentValues对象,要把更新的数据在这里装进去,第三个四个参数,用于去约束更新某一行或几行中的数据,不指定的话就是默认更新所有行,
SQLiteDatabase db= dbHelper.getWritableDatabase();
ContentValues values= new ContentValues();
values.put(“word”, “999999”);
db.update(“dict”, values, “detail= ?”, new String[]{“45666”});
3、删除数据:delete();方法专门用于删除数据这个方法接受三个参数:第一个:表名,第二个三个又是用于约束删除某一行或几行的数据,不指定的话就默认删除所有行。
SQLiteDatabase db= dbHelper.getWritableDatabase();
db.delete(“dict”, “detail=?”, new String[]{“1111”});
4、查询数据:query();方法最短的一个方法也需要传入七个参数:
第一个参数:表名
第二个参数:用于指定去查询那几列,如果不指定,就默认查询所有列
第三个四个参数:用于约束查询某一行,或某几行的数据,不指定就默认是查询所有行的数据,、
第五个参数: 用于指定需要去group by 的列,不指定则表示不对查询结果group by操作,
第六个参数:用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤,
第七个参数:用于指定查询结果的排序的方式
Cursor cursor=db.query(“dict”, null, null, null, null, null, null);
if(cursor.moveToFirst()){
do {
//遍历Cursor 对象,取出数据
String name=cursor.getString(cursor.getColumnIndex(“word”));
String detail=cursor.getString(cursor.getColumnIndex(“detail”));
Log.i(“11111111111”,”name”+name);
Log.i(“11111111111”,”detail”+detail);

                } while (cursor.moveToNext());            }        }
0 0
原创粉丝点击