SQLite是一种轻量级的小型数据库,虽然比较小,但是功能相对比较完善,一些常见的数据库基本功能也具有,在现在的嵌入式系统中使用该数据库的比较多,因为它占用系统资源很少。
一、sqlite数据库简介
特点:
1) 轻量级-占用资源少
2) 独立性-不依赖其他软件
3) 隔离性-所有信息都在一个文件里面
4) 跨平台-android和ios都用的是sqlite
5) 多语言接口-可以java、php等多语言
6) 安全性-独占性和共享锁
二、环境搭建
第一步:右键点击我的电脑(或者是计算机),选中属性进入 控制面板项>高级系统设置>系统属性设置>环境变量
新建一个系统变量,名字就叫做android(自己命名),里面的值就是sdk/platform-tools所在目录,里面有个文件sqlite3.exe
例如:D:\SDK\android-sdk-windows\platform-tools
注意,变量值最后不要加 ; 这个.
然后就是将android这个变量加到系统变量path里面。
使用这句 %android% 就可以了,
然后就打开dos操作界面,输入 adb shell
出现#号就是环境配置好了。
Window系统环境变量:
%SystemRoot%;%SystemRoot%\system32\wbem
%SystemRoot%: 就是 C:\windows;
三、数据库的操作
首先、新建一个类 ,该类继承自SQLiteOpenHelper,然后重写里面的方法。
构造方法
public static DatabaseHelper getInstance(Context context) { if (DB_HELPER == null) { DB_HELPER = new DatabaseHelper(context); } return DB_HELPER; }
还有
/** * 数据库创建时执行 */ @Override public void onCreate(SQLiteDatabase db) { String sql = "create table "+DataColumn.Student.TABLE_NAME + " (" + DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + DataColumn.Student.COLUMN_NAME_NAME + " TEXT, " + DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT " + ")"; String sql1 = "create table "+ DataColumn.Tearch.TABLE_NAME +" (" + DataColumn.Tearch._ID+ " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + DataColumn.Tearch.COLUMN_NAME_NAME + " TEXT" + ")"; db.execSQL(sql); db.execSQL(sql1); }
Oncreate方法是在数据库创建的时候执行的。
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。
方法名 方法描述
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)
//构造方法,一般是传递一个要创建的数据库名称作为参数
onCreate(SQLiteDatabase db) //创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) //版本更新时调用
getReadableDatabase() //创建或打开一个只读数据库
getWritableDatabase() //创建或打开一个读写数据库
getWritableDatabase()和getReadableDatabase()的区别:
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才调用。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,
getWritableDatabase()打开数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库,
倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.
创建数据库代码:
/** * 数据库创建时执行 */ @Override public void onCreate(SQLiteDatabase db) { String sql = "create table "+DataColumn.Student.TABLE_NAME + " (" + DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + DataColumn.Student.COLUMN_NAME_NAME + " TEXT, " + DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT " + ")"; String sql1 = "create table "+ DataColumn.Tearch.TABLE_NAME +" (" + DataColumn.Tearch._ID+ " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," + DataColumn.Tearch.COLUMN_NAME_NAME + " TEXT" + ")"; db.execSQL(sql); db.execSQL(sql1); }
而onUpgrade是在数据库版本或字段有变动的时候执行的。
/** * 数据库版本发生变化 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion < 3){ String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT "; db.execSQL(sql); } String sql1 = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_SCORE+" TEXT "; db.execSQL(sql1); }
数据库的基本增删改查应该是在普通类里面写方法来实现。
在该类初始化的时候要 实例化继承了SQLiteOpenHelper类的对象,然后在该对象上得到SQLiteDatabase对象,以后的操作就在该对象上执行。
代码如下
public SQLiteDatabase db;//声明为全局变量 //实例化db的操作在oncreate里进行 DatabaseHelper dbHelper = DatabaseHelper.getInstance(this); db = dbHelper.getReadableDatabase(); //如果数据库不存在则创建数据库,否则直接打开数据库
比如添加就写一个普通的添加方法,使用android方式操作数据库。也可以使用sql语句。例如:
Android:实现方式
1、增加
2、删除
3、修改
4、查询
//打开或创建test.db数据库
//方法一:openOrCreateDatabase ,方法二: SQLiteDatabase的帮助类 SQLiteOpenHelper类实现
/** * 数据库操作方法一 */ public void operOrCreateDataBase() { SQLiteDatabase db = openOrCreateDatabase("bruce.db", MODE_PRIVATE, null); db.execSQL("create table student (id INTEGER NOT NULL,name TEXT,PRIMARY KEY(id))"); db.execSQL("insert into student (id,name) values (1001,'张三')"); }
数据的添加
ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据 cv.put("username","Jack Johnson");//添加用户名 cv.put("password","iLovePopMusic"); //添加密码 db.insert("user",null,cv);//执行插入操作 2.使用execSQL方式来实现 String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句 db.execSQL(sql);//执行SQL语句
String whereClause = "username=? and "sex=?";//删除的条件 String[] whereArgs = {"Jack Johnson","男"};//删除的条件参数 db.delete("user",whereClause,whereArgs);//执行删除 使用execSQL方式的实现 String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句 db.execSQL(sql);//执行删除操作
ContentValues cv = new ContentValues();//实例化ContentValues cv.put("password","iHatePopMusic");//添加要更改的字段及内容 String whereClause = "username=?";//修改条件 String[] whereArgs = {"Jack Johnson"};//修改条件的参数 db.update("user",cv,whereClause,whereArgs);//执行修改
Cursor cursor = db.query(DataColumn.Student.TABLE_NAME, null, null, null, null, null, null, null);各参数说明:
实现代码
Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标 if(c.moveToFirst()){//判断游标是否为空 for(int i=0;i<c.getCount();i++){ c.move(i);//移动到指定记录 String username = c.getString(c.getColumnIndex("username"); String password = c.getString(c.getColumnIndex("password")); } } 通过rawQuery实现的带参数查询 Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"}); if(cursor.moveToFirst()) { String password = c.getString(c.getColumnIndex("password")); }
数据库在activity界面最后一定要关闭
@Override protected void onDestroy() { super.onDestroy(); if (db != null) { if (db.isOpen()) { db.close(); db = null; } } }
public class MyCursorAdapter extends CursorAdapter{ private LayoutInflater mInflater; public MyCursorAdapter(Context context,Cursor cursor) { super(context, cursor, FLAG_REGISTER_CONTENT_OBSERVER); mInflater = LayoutInflater.from(context); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { View view = mInflater.inflate(R.layout.view_db1_item_layout, null); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { TextView idTxt = (TextView) view.findViewById(R.id.db_id_txt); TextView nameTxt = (TextView) view.findViewById(R.id.db_username_txt); TextView numberTxt = (TextView) view.findViewById(R.id.db_number_txt); int id = cursor.getInt(cursor.getColumnIndex(DataColumn.Student._ID)); String name = cursor.getString(cursor.getColumnIndex(DataColumn.Student.COLUMN_NAME_NAME)); String number = cursor.getString(cursor.getColumnIndex(DataColumn.Student.COLUMN_NAME_NUMBER)); idTxt.setText(""+id); nameTxt.setText(name); numberTxt.setText(number); } }