Android SQLite

一、使用SQLiteOpenHelper类创建数据库与版本管理

1、nCreate(database) :首次使用软件时生成数据库表
2、onUpgrade(database,oldVersion,newVersion):在数据库的版本发生变化时会被调用, 一 般 在软件升级时才需改变版本号,而数据库的版本是由程序员控制的

复制代码
public class MyDBOpenHelper extends SQLiteOpenHelper {
    public MyDBOpenHelper(Context context, String name, CursorFactory factory,
            int version) {super(context, "my.db", null, 1); }
    @Override
    //数据库第一次创建时被调用
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE person(personid INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))");
        
    }
    //软件版本号发生改变时调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL");
    }
}

当调用的MyDBOpenhelper的对象的getWritableDatabase()就会在下述目录下创建我们的db 数据库文件:

可以使用SQLite图形化工具(SQLite Expert )查看db文件

二、Demo

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Context mContext;

private Button btn_insert;

private Button btn_query;

private Button btn_update;

private Button btn_delete;

private SQLiteDatabase db;

private MyDBOpenHelper myDBHelper;

private StringBuilder sb;

private int i = 1;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mContext = MainActivity.this;

myDBHelper = new MyDBOpenHelper(mContext, "my.db", null, 1);

bindViews();

}

private void bindViews() {

btn_insert = (Button) findViewById(R.id.btn_insert);

btn_query = (Button) findViewById(R.id.btn_query);

btn_update = (Button) findViewById(R.id.btn_update);

btn_delete = (Button) findViewById(R.id.btn_delete);

btn_query.setOnClickListener(this);

btn_insert.setOnClickListener(this);

btn_update.setOnClickListener(this);

btn_delete.setOnClickListener(this);

}

@Override

public void onClick(View v) {

db = myDBHelper.getWritableDatabase();

switch (v.getId()) {

case R.id.btn_insert:

ContentValues values1 = new ContentValues();

values1.put("name", "呵呵~" + i);

i++;

//参数依次是:表名,强行插入null值得数据列的列名,一行记录的数据

db.insert("person", null, values1);

Toast.makeText(mContext, "插入完毕~", Toast.LENGTH_SHORT).show();

break;

case R.id.btn_query:

sb = new StringBuilder();

//参数依次是:表名,列名,where约束条件,where中占位符提供具体的值,指定group by的列,进一步约束

//指定查询结果的排序方式

Cursor cursor = db.query("person", null, null, null, null, null, null);

if (cursor.moveToFirst()) {

do {

int pid = cursor.getInt(cursor.getColumnIndex("personid"));

String name = cursor.getString(cursor.getColumnIndex("name"));

sb.append("id:" + pid + ":" + name + "\n");

} while (cursor.moveToNext());

}

cursor.close();

Toast.makeText(mContext, sb.toString(), Toast.LENGTH_SHORT).show();

break;

case R.id.btn_update:

ContentValues values2 = new ContentValues();

values2.put("name", "嘻嘻~");

//参数依次是表名,修改后的值,where条件,以及约束,如果不指定三四两个参数,会更改所有行

db.update("person", values2, "name = ?", new String\[\]{"呵呵~2"});

break;

case R.id.btn_delete:

//参数依次是表名,以及where条件与约束

db.delete("person", "personid = ?", new String\[\]{"3"});

break;

}

}

}

三、使用SQL语句操作数据库,QLiteDatabase提供的相关方法:

  • execSQL(SQL,Object\[\]):使用带占位符的SQL语句,这个是执行修改数据库内容的sql语句用的
  • rawQuery (SQL,Object\[\]):使用带占位符的SQL查询操作 另外前面忘了介绍下Curosr这个东西以及相关属性,这里补充下: ------Cursor对象有点类似于JDBC中的ResultSet,结果集!使用差不多,提供一下方法移动查询结果的记录指针:
  • move(offset):指定向上或者向下移动的行数,整数表示向下移动;负数表示向上移动!
  • moveToFirst():指针移动到第一行,成功返回true,也说明有数据
  • moveToLast():指针移动到最后一样,成功返回true;
  • moveToNext():指针移动到下一行,成功返回true,表明还有元素!
  • moveToPrevious():移动到上一条记录
  • getCount( )获得总得数据条数
  • isFirst():是否为第一条记录
  • isLast():是否为最后一项
  • moveToPosition(int):移动到指定行

1.插入数据:

复制代码
public void save(Person p)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("INSERT INTO person(name,phone) values(?,?)",
                new String[]{p.getName(),p.getPhone()});
}

2.删除数据:

复制代码
public void delete(Integer id)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("DELETE FROM person WHERE personid = ?",
                new String[]{id});
}

3.修改数据:

复制代码
public void update(Person p)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("UPDATE person SET name = ?,phone = ? WHERE personid = ?",
        new String[]{p.getName(),p.getPhone(),p.getId()});
}

4.查询数据:

复制代码
public Person find(Integer id)
{
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT * FROM person WHERE personid = ?",
            new String[]{id.toString()});
    //存在数据才返回true
    if(cursor.moveToFirst())
    {
        int personid = cursor.getInt(cursor.getColumnIndex("personid"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String phone = cursor.getString(cursor.getColumnIndex("phone"));
        return new Person(personid,name,phone);
    }
    cursor.close();
    return null;
}

5.数据分页:

复制代码
public List<Person> getScrollData(int offset,int maxResult)
{
    List<Person> person = new ArrayList<Person>();
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT * FROM person ORDER BY personid ASC LIMIT= ?,?",
        new String[]{String.valueOf(offset),String.valueOf(maxResult)});
    while(cursor.moveToNext())
    {
        int personid = cursor.getInt(cursor.getColumnIndex("personid"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String phone = cursor.getString(cursor.getColumnIndex("phone"));
        person.add(new Person(personid,name,phone)) ;
    }
    cursor.close();
    return person;
}

6.查询记录数:

复制代码
public long getCount()
{
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT COUNT (*) FROM person",null);
    cursor.moveToFirst();
    long result = cursor.getLong(0);
    cursor.close();
    return result;   
    //除了上面获取条数的方法外还可以使用cursor.getCount()方法获得数据的条数, 但是SQL语句要改     改!比如SELECT * FROM person;   
}   

四、事务

复制代码
SQLiteDatabase mydb = myDBHelper.getWritableDatabase();
mydb.beginTransaction();//开启事务
  try {
        mydb.execSQL("update person set adress = ? where personid=?",
                   new String[]{"呼呼家~" + i,"20000"});
        mydb.execSQL("INSERT INTO person(name,phone) values(?,?)",
                   new String[]{"噜噜~" + i,"phone"+i});
        mydb.setTransactionSuccessful();//提交事务
    }finally {
        mydb.endTransaction();//结束事务
    }


五、SimpleCursorAdapter绑定数据库数据

六、数据库版本升级

假如我们已经升级到第三个版本了,我们在第二个版本增加了一个表, 然后第三个版本也增加了一个表,加入用户直接从第一个版本升级到第三个版本,这样 没经过第二个版本,就没有增加的那个表....?

复制代码
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
            int arg2, int arg3) {
    switch(arg2){
        case 1:
            db.execSQL(第一个版本的建表语句);
        case 2:
            db.execSQL(第二个版本的建表语句);
        case 3:
            db.execSQL(第三个版本的建表语句); 
    }
}
这里并没有写break,这就对了,这是为了保证跨版本升级时,每次数据库 修改都能全部执行到!这样可以保证表结构都是最新的!
相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui