Android入门教程 SQLite的用法

一、为什么要用SQLite

前面的博客中已经讲过了sharedpreferences的用法,大家也都看到了,sharedpreferences使用简单,但同时也有局限性,因为它是xml存储形式的,所以在排序、筛选等方面略显不足。

提到排序、筛选、比较等需求,我们自然而然会想到数据库,这也正是android自带数据库——SQLite的来由。

二、SQLite是什么

  • SQLite数据库存储是Android系统提供的数据存储方式之一
  • SQLite是专为嵌入式设备设计的一款轻量级数据库
  • SQLite占用资源非常低,在嵌入式设备中,只需要几百K的内存
  • SQLite支持标准的SQL语法,遵循数据库的ACID事务
  • SQLite是android系统自带,不需要单独安装,不需要用户名密码就可以使用

三、SQLite怎么用

step1:新建类继承SQLiteOpenHelper

新建一个类(类名自定义)继承SQLiteOpenHelper,并实现构造方法、重写oncreate和onupgrade方法。

public class DBHelper extends SQLiteOpenHelper {

    private String createSQL = "create table student(" 
            + "id integer primary key  autoincrement not null ,"
            + "name varchar(20) not null," 
            + "age integer not null ," 
            + "gender varchar(2) not null)";

    /**
     * 
     * @param context
     * @param name 数据库名字
     * @param factory 数据库进行查询的时候会返回一个cursor,这个cursor就是在上面的factory中产生的。
如果有需求,可以自定义factory,这样返回的cursor就会符合自己的需求!
     * @param version 数据库版本号
     */
    public DBHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(createSQL);
    }

    /**
     * 该方法会在数据库需要升级的时候调用
     * 
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE student ADD COLUMN other TEXT");
    }

}

step2:创建SQLiteDatabase对象

这里有两种创建方式,分别是:

1、只读模式

SQLiteDatabase  sqldb = dbhelper.getReadableDatabase();

2、读写模式

SQLiteDatabase  sqldb = dbhelper.getWritableDatabase();

step3:通过实现增删改查操作

1、增

private void insert() {
        String name = nameEdit.getText().toString();
        //获得SQLiteDatabase对象,读写模式
        sqldb = dbhelper.getWritableDatabase();
        //ContentValues类似HashMap,区别是ContentValues只能存简单数据类型,不能存对象
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("age", 20);
        values.put("gender", "男");
        //执行插入操作
        sqldb.insert(TABLE_NAME, null, values);
    }

2、删

private void delete() {
        sqldb = dbhelper.getWritableDatabase();
        //第二个参数是WHERE语句(即执行条件,删除哪条数据)
        //第三个参数是WHERE语句中占位符(即"?"号)的填充值
        sqldb.delete(TABLE_NAME, "name=?", new String[]{"jack"});//删除name的值是jack的那条记录
    }

3、改

private void modify() {
        SQLiteDatabase  sqldb = dbhelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put("name", "Jet");
        //第二个参数是修改的字段及修改的值(已经存放到ContentValues中)
        //第三个参数是WHERE语句
        //第四个参数是WHERE语句中占位符的填充值
        //如果第三四个参数为null,那就将每条记录都改掉
        sqldb.update(TABLE_NAME, values, null, null);
    }

4、查

private void show() {
        //得到数据库对象
        sqldb = dbhelper.getReadableDatabase();
        //创建游标
        Cursor mCursor = sqldb.query(TABLE_NAME, new String[] { "id", "name", "age", "gender" }, "age>?", new String[]{"10"}, null, null,
                null);
        //游标置顶
        mCursor.moveToFirst();
        //遍历
        do{
            String name = mCursor.getString(mCursor.getColumnIndex("name"));
            System.out.println(name);
        }while(mCursor.moveToNext());
    }

四、示例代码

DBHelper类代码


public class DBHelper extends SQLiteOpenHelper {

    private String createSQL = "create table student(" 
            + "id integer primary key  autoincrement not null ,"
            + "name varchar(20) not null," 
            + "age integer not null ," 
            + "gender varchar(2) not null)";

    /**
     * 
     * @param context
     * @param name 数据库名字
     * @param factory 数据库进行查询的时候会返回一个cursor,这个cursor就是在上面的factory中产生的。
如果有需求,可以自定义factory,这样返回的cursor就会符合自己的需求!
     * @param version 数据库版本号
     */
    public DBHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(createSQL);
    }

    /**
     * 该方法会在数据库需要升级的时候调用
     * 
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE student ADD COLUMN other TEXT");
    }

}

MainActivity类代码

public class MainActivity extends Activity implements OnClickListener {

    private Button addBtn;
    private Button deleteBtn;
    private Button modifyBtn;
    private Button showBtn;
    private EditText nameEdit;

    private DBHelper dbhelper;
    private SQLiteDatabase sqldb;

    private static final String TABLE_NAME = "student";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindID();
        dbhelper = new DBHelper(this, "demodb", null, 1);
    }

    /**
     * 绑定ID和监听事件
     */
    private void bindID() {
        addBtn = (Button) findViewById(R.id.addBtn);
        deleteBtn = (Button) findViewById(R.id.deleteBtn);
        modifyBtn = (Button) findViewById(R.id.modifyBtn);
        showBtn = (Button) findViewById(R.id.showBtn);
        nameEdit = (EditText) findViewById(R.id.nameEdit);

        addBtn.setOnClickListener(this);
        deleteBtn.setOnClickListener(this);
        modifyBtn.setOnClickListener(this);
        showBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.addBtn:
            insert();
            break;
        case R.id.deleteBtn:
            delete();
            break;
        case R.id.modifyBtn:
            modify();
            break;
        case R.id.showBtn:
            show();
            break;
        default:
            break;
        }
    }

    private void insert() {
        String name = nameEdit.getText().toString();
        //获得SQLiteDatabase对象,读写模式
        sqldb = dbhelper.getWritableDatabase();
        //ContentValues类似HashMap,区别是ContentValues只能存简单数据类型,不能存对象
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("age", 20);
        values.put("gender", "男");
        //执行插入操作
        sqldb.insert(TABLE_NAME, null, values);
    }

    private void delete() {
        sqldb = dbhelper.getWritableDatabase();
        //第二个参数是WHERE语句(即执行条件,删除哪条数据)
        //第三个参数是WHERE语句中占位符(即"?"号)的填充值
        sqldb.delete(TABLE_NAME, "name=?", new String[]{"jack"});
    }

    private void modify() {
        SQLiteDatabase  sqldb = dbhelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put("name", "Jet");
        //第二个参数是修改的字段及修改的值(已经存放到ContentValues中)
        //第三个参数是WHERE语句
        //第四个参数是WHERE语句中占位符的填充值
        //如果第三四个参数为null,那就将每条记录都改掉
        sqldb.update(TABLE_NAME, values, null, null);
    }

    private void show() {
        //得到数据库对象
        sqldb = dbhelper.getReadableDatabase();
        //创建游标
        Cursor mCursor = sqldb.query(TABLE_NAME, new String[] { "id", "name", "age", "gender" }, "age>?", new String[]{"10"}, null, null,
                null);
        //游标置顶
        mCursor.moveToFirst();
        //遍历
        do{
            String name = mCursor.getString(mCursor.getColumnIndex("name"));
            System.out.println(name);
        }while(mCursor.moveToNext());
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出程序后,关闭数据库资源
        sqldb.close();
    }
}

布局文件代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText 
        android:id="@+id/nameEdit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入学生姓名"
        />

    <Button 
        android:id="@+id/addBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新增"
        />
    <Button 
        android:id="@+id/deleteBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除"
        />
    <Button 
        android:id="@+id/modifyBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="修改"
        />
    <Button 
        android:id="@+id/showBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="显示"
        />

</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值