作为初学者来说数据库的操作还是挺不容易的,因为最近做了一个关于数据库的东西,想和大家分享一下自己对数据库理解,以及在写数据库的时候遇到的问题及其解决方法,在写android数据库的时候可以参照java的来写,语法雷同。
android中的数据库占用内存较小,使用方便,用途很广,所以熟悉android中的数据库对将来的开发很有帮助,由于我也是初次接触数据库,可能理解的不太透彻,还望大家取其精华去其糟粕。
首先,要明白一点,SQLite中的数据是以数据表的形式存储的,我先写了一个activity,重写SQLite数据库中的SQLiteOpenHelper类,代码如下。
package com.example.fingerprint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils;
public class data_ku extends SQLiteOpenHelper {//重写数据库帮助类
// String name="20171101222 'caimingxiu' 'null' '24' '29' ";
String str_user="stu";
String str="create table if not exists Stu (id integer primary key autoincrement,name text ,finger text)";
private SQLiteDatabase bd;
private static final String data_name="dataku";
//构造方法
public data_ku(Context c)
{
//调用父类的构造方法,参数为(Context,数据库name,工厂(默认null),版本)
super(c,data_name,null,3);
}
@Override
//实现onCreate抽象方法,创建数据库
public void onCreate(SQLiteDatabase db)
{
this.bd=db;
//数据库对象执行SQL语句即可
db.execSQL(str);
}
public void insert(ContentValues contentValues)
{
SQLiteDatabase db=getWritableDatabase();//得到database对象
db.insert(str_user,null,contentValues);
db.close();
}
@Override
//实现onUpgrade抽象方法,更新数据库(删掉原有的重新写)
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// db.execSQL(" ALTER TABLE Stu ADD phone VARCHAR(12)"); //往表中增加一列
}
//查询数据
public Cursor query()
{
SQLiteDatabase bd=getWritableDatabase();
Cursor c= bd.query(str_user,null,null,null,null,null,null);
//全部查询
return c;
}
//按学号删除数据
public void del(int id)
{
if(bd==null)
bd=getWritableDatabase();
bd.delete(str_user,"id=?",new String[]{String.valueOf(id)});
}
public void replace(int id,String values)
{
bd=getWritableDatabase();
// bd.execSQL("replace into stu VALUES(2,'caimingxiu','null','null','null') ");
bd.execSQL("replace into stu VALUES "+ "(" + values +")" );
}
//添加列数
public void addColumn(SQLiteDatabase db, String[] newColumnArr,
String oldTableName) {
if (db == null || newColumnArr == null || newColumnArr.length < 1
|| TextUtils.isEmpty(oldTableName)) {
// 数据库为空,新字段个数为0,添加字段后的字段数组个数为0,旧表名为空
return;
}
// 拿到旧表中所有的数据
Cursor cursor = db.rawQuery("select * from stu" , null);
if (cursor == null) {
// 如果游标为空,说明旧表中没有数据,如果是这种情况那就可以直接改表的字段,不需要转移数据了,代码后面也有,省略掉复制数据的操作就好
return;
}
// 拿到原来的表中所有的字段名
String[] oldColumnNames = cursor.getColumnNames();
// 更改原表名为临时表
// String tempTableName = "temp_stu" ;
db.execSQL(
"alter table stu" + " rename to xxx" );
// 创建新表
if (oldColumnNames.length < 1) {
// 如果原来的表中字段个数为0
return;
}
// 创建一个线程安全的字符串缓冲对象,防止用conn多线程访问数据库时造成线程安全问题
StringBuffer createNewTableStr = new StringBuffer();
createNewTableStr
.append("create table if not exists " + oldTableName + "(");
for (int i = 0; i < oldColumnNames.length; i++) {
if (i == 0) {
createNewTableStr.append(oldColumnNames[i]
+ " integer primary key autoincrement,");
} else {
createNewTableStr.append(oldColumnNames[i] + " text"+",");
}
}
for (int i = 0; i < newColumnArr.length; i++) {
if (i == newColumnArr.length - 1) {
// 最后一个
createNewTableStr.append(newColumnArr[i] + "text"+")");
} else {
// 不是最后一个
createNewTableStr.append(newColumnArr[i] +"text"+ ",");
}
}
db.execSQL(createNewTableStr.toString());
// 复制旧表数据到新表
StringBuffer copySQLStr = new StringBuffer();
copySQLStr.append("insert into stu" + " select *,");
// 有多少个新的字段,就要预留多少个' '空值给新字段
for (int i = 0; i < newColumnArr.length; i++) {
if (i == newColumnArr.length - 1) {
// 最后一个
// copySQLStr.append("' ' from " + tempTableName);
copySQLStr.append(" ' 'from xxx" );
} else {
// 不是最后一个
copySQLStr.append("' ' text,");
}
}
db.execSQL(copySQLStr.toString());
// 删除旧表
db.execSQL("drop table xxx");
// 关闭游标
cursor.close();
}
public void close()
{
if(bd!=null)
bd.close();
}
}
在重写数据库帮助类的时候实现了数据库的增删改查的功能,也可以按照自己的需求来重写数据库,也可以不重写,直接用android自带的数据库帮助类也可以,重写数据库的好处是在应用的时候可以更加的方便 ,下面我来分快介绍一下我的代码。
String str="create table if not exists Stu (id integer primary key autoincrement,name text ,finger text)";
这是一个execSQL语句,用于创建一个数据库。
public void insert(ContentValues contentValues)
{
SQLiteDatabase db=getWritableDatabase();//得到database对象
db.insert(str_user,null,contentValues);
db.close();
}
每一个模块都要先打开数据库,SQLiteDatabase db=getWritableDatabase();这是以读写的形式打开数据库。这个insert实现了数据的添加,添加的数据为contentValues的对象携带的数据,将会在下一个activity中给出数据。
onUpdate方法为数据库更新的时候才会执行里面的语句。
public Cursor query()
{
SQLiteDatabase bd=getWritableDatabase();
Cursor c= bd.query(str_user,null,null,null,null,null,null);
//全部查询
return c;
}
query模块为查找模块,返回值为游标(cursor)对象,可以通过游标对象来查找数据库中的数据。
public void del(int id)
{
if(bd==null)
bd=getWritableDatabase();
bd.delete(str_user,"id=?",new String[]{String.valueOf(id)});
}
del为删除模块,通过id来删除相关数据。id=?
public void replace(int id,String values)
{
bd=getWritableDatabase();
// bd.execSQL("replace into stu VALUES(2,'caimingxiu','null','null','null') ");
bd.execSQL("replace into stu VALUES "+ "(" + values +")" );
}
replace为更改数据表中的数据,括号中的参数即为要修改的数据。
由于本篇写的比较仓促,有很多待完善的地方,以后会继续改进,本篇内容较多,还会在下一篇中继续介绍SQLite数据库的使用,未完待续,欢迎转载