android数据库SQLite(1)

android和ios的数据库都是用SQLite来实现。
在安卓里面数据库怎么用呢,简单来说可用分为以下三步:
1、新建一个数据库帮助类,继承自SQLiteOpenHelper,复写onCreate() 和 onUpgrade()
2、新建一个数据里操作类(dao类),利用 数据库帮助类 得到数据库的实例,然后在dao类里面编写 增删改查 的方法
3、在Activity里面实例化数据库操作类(dao类),调用对应的 增删查改方法。
(对数据进行的操作也就无非四种,即CRUD。其中C代表添加(Create),R代表查询(Retrieve),U代表更新(Update),D代表删除(Delete)。有人叫增删改查,有人叫增删查改)

一、SQLite数据库简介

  • 轻量级 : SQLite数据库是一个轻量级的数据库, 适用于少量数据的CURD;
  • 文件本质 : SQLite数据库支持大部分SQL语法, 允许使用SQL语句操作数据库, 其本质是一个文件, 不需要安装启动;
  • 数据读写 : SQLite数据库打开只是打开了一个文件的读写流, 如果有大数据量读写, 需要高并发存储, 那么就不应该使用SQLite;

二、安卓数据如何使用

1、编写数据库帮助类

  • 新建一个数据库帮助类,继承自SQLiteOpenHelper
  • 编写构造函数
  • 复写onCreate() 和 onUpgrade()

代码如下:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/** * 数据库Helper类,必须继承自 SQLiteOpenHelper * 当一个继承自 SQLiteOpenHelper 后需要复写两个方法,分别是 onCreate() 和 onUpgrade() * onCreate(): onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录 * onUpgrade():onUpGrade是在数据库版本升级的时候调用的,主要用来改变表结构 * * * 数据库帮助类要做的事情特别简单: * 1、复写onCreate() 和 onUpgrade()方法 * 2、在这两个方法里面填写相关的sql语句 */
public class MyDBHelper extends SQLiteOpenHelper{

    public MyDBHelper(Context context) {
        /** * 参数说明: * * 第一个参数: 上下文 * 第二个参数:数据库的名称 * 第三个参数:null代表的是默认的游标工厂 * 第四个参数:是数据库的版本号 数据库只能升级,不能降级,版本号只能变大不能变小 */
        super(context, "mintest.db", null, 2);
    }
    /** * onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录 * * 当数据库第一次被创建的时候调用的方法,适合在这个方法里面把数据库的表结构定义出来. * 所以只有程序第一次运行的时候才会执行 * 如果想再看到这个函数执行,必须写在程序然后重新安装这个app */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table contactinfo (id integer primary key autoincrement, name varchar(20), phone varchar(20))");
    }
    /** * 当数据库更新的时候调用的方法 * 这个要显示出来得在上面的super语句里面版本号发生改变时才会 打印 (super(context, "itheima.db", null, 2); ) * 注意,数据库的版本号只可以变大,不能变小,假设我们当前写的版本号是3,运行,然后又改成1,运行则报错。不能变小 * @param db * @param oldVersion * @param newVersion */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table contactinfo add account varchar(20)");
    }
}

2、数据库操作类(dao类)

dao类在这里做得事情特别简单:

  • 1、定义一个构造方法,利用这个方法去实例化一个 数据库帮助类
  • 2、编写dao类的对应的 增删改查 方法。

代码如下:

package amqr.com.dbanddao.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import amqr.com.dbanddao.db.MyDBHelper;

/** * ContactInjfoDao 数据库操作类 dao后缀的都是数据库操作类 * 我们这里的每一个 增删改查 的方法都通过getWritableDatabase()去实例化了一个数据库,这里必须这么做 * 不客气抽取 成为一个成员变量, 否则报错,若是觉得麻烦可以通过定义方法来置为null和重新赋值 * —— 其实dao类在这里做得事情特别简单: * 1、定义一个构造方法,利用这个方法去实例化一个 数据库帮助类 * 2、编写dao类的对应的 增删改查 方法。 */
public class ContactInjfoDao {

    private MyDBHelper mMyDBHelper;

    /** * dao类需要实例化数据库Help类,只有得到帮助类的对象我们才可以实例化 SQLiteDatabase * @param context */
    public ContactInjfoDao(Context context) {
        mMyDBHelper=new MyDBHelper(context);
    }
    // 将数据库打开帮帮助类实例化,然后利用这个对象
    // 调用谷歌的api去进行增删改查
    // 增加的方法吗,返回的的是一个long值
    public long addDate(String name,String phone){
        // 增删改查每一个方法都要得到数据库,然后操作完成后一定要关闭
        // getWritableDatabase(); 执行后数据库文件才会生成
        // 数据库文件利用DDMS可以查看,在 data/data/包名/databases 目录下即可查看
        SQLiteDatabase sqLiteDatabase =  mMyDBHelper.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put("name",name);
        contentValues.put("phone", phone);
        // 返回,显示数据添加在第几行
        // 加了现在连续添加了3行数据,突然删掉第三行,然后再添加一条数据返回的是4不是3
        // 因为自增长
        long rowid=sqLiteDatabase.insert("contactinfo",null,contentValues);
        sqLiteDatabase.close();
        return rowid;
    }
    // 删除的方法,返回值是int
    public int deleteDate(String name){
        SQLiteDatabase sqLiteDatabase = mMyDBHelper.getWritableDatabase();
        int deleteResult = sqLiteDatabase.delete("contactinfo", "name=?", new String[]{name});
        sqLiteDatabase.close();
        return deleteResult;
    }
    /** * 修改的方法 * @param name * @param newPhone * @return */
    public int updateData(String name,String newPhone){
        SQLiteDatabase sqLiteDatabase = mMyDBHelper.getWritableDatabase();
        ContentValues contentValues =new ContentValues();
        contentValues.put("phone", newPhone);
        int updateResult = sqLiteDatabase.update("contactinfo", contentValues, "name=?", new String[]{name});
        sqLiteDatabase.close();
        return updateResult;
    }
    /** * 查询的方法(查找电话) * @param name * @return */
    public String alterDate(String name){
        String phone = null;
        SQLiteDatabase readableDatabase = mMyDBHelper.getReadableDatabase();
        // 查询比较特别,涉及到 cursor
        Cursor cursor = readableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
        if(cursor.moveToNext()){
            phone=cursor.getString(0);
        }
        cursor.close(); // 记得关闭 corsor
        readableDatabase.close(); // 关闭数据库
        return phone;
    }
}

3、在Activity里面利用dao类操作数据库

xml布局文件

<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=".MainActivity" >
    <EditText android:id="@+id/mEtName" android:hint="请输入联系人的姓名" android:layout_width="match_parent" android:layout_height="wrap_content" >
    </EditText>
    <EditText android:id="@+id/mEtPhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入联系人的电话" android:inputType="phone" />
    <Button android:onClick="add" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="添加" />
    <Button android:onClick="delete" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="删除" />
    <Button android:onClick="update" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="修改" />
    <Button android:onClick="query" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="查询" />
</LinearLayout>

<br/>

4、Activity代码:

package amqr.com.dbanddao;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import amqr.com.dbanddao.dao.ContactInjfoDao;
public class MainActivity extends AppCompatActivity {
    private EditText mEtName;
    private EditText mEtPhone;
    private ContactInjfoDao mDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDao=new ContactInjfoDao(MainActivity.this);
        mEtName= (EditText) findViewById(R.id.mEtName);
        mEtPhone= (EditText) findViewById(R.id.mEtPhone);
    }
    public void add(View view){
        String name=mEtName.getText().toString().trim();
        String phone=mEtPhone.getText().toString().trim();
        if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
            Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            long addLong = mDao.addDate(name, phone);
            if(addLong==-1){
                Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show();
            }
        }
    }
    public void delete(View view){
        String name=mEtName.getText().toString().trim();
        if(TextUtils.isEmpty(name)){
            Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            int deleteDate = mDao.deleteDate(name);
            if(deleteDate==-1){
                Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show();
            }
        }
    }
    public void update(View view){

        String name=mEtName.getText().toString().trim();
        String phone=mEtPhone.getText().toString().trim();
        if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
            Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            int count=mDao.updateData(name, phone);
            if(count==-1){
                Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show();
            }
        }
    }
    public void query(View view){

        String name=mEtName.getText().toString().trim();

        if(TextUtils.isEmpty(name)){
            Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
            return;
        }else{
            String phoneResult = mDao.alterDate(name);

            Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show();
        }
    }
}

至此完成


你可能感兴趣的:(android数据库SQLite(1))