Android 自带的SQLite的原生数据库基本使用

Posted Rocky_ruan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 自带的SQLite的原生数据库基本使用相关的知识,希望对你有一定的参考价值。

android原生数据库SQLite使用

简介:SQLite是一个开源的嵌入式关系数据库,它可以减少用用程序的管理数据开销,SQLite可移植性好,很容易使用,很少,高效而可靠。
一:SQLiteOpenHelper类(SQLite数据库操作类)
作用:管理数据库(创建,增加,删,修,改)&版本控制。
两个重要的方法
onCreate(SQLiteDatabase db) 创建数据库 创建数据库时自动调用
onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion)升级数据库
其他方法
1.getWritableDatabase() 创建或者打开可以读/写的数据库 返回SQLiteDatabase对象
2.getReadableDatabase() 创建或打开可读的数据库 返回SQLiteDatabase对象
3.拿到返回SQLiteDatabase对象可以执行

1.execSQL(sql) 通过执行sql语句可以进行增删改操作,不能执行查询操作
2.query(),rawQuery()查询数据库
3.insert()插入数据
4.delete()删除数据
5.close()关闭所有打开的数据库对象

4.对于“增、删、改(更新)”这类对表内容变换的操作,需先调用getWritableDatabase()获得一个可写数据库对象,在执行的时候调用通用的execSQL(String sql)或对应的操作API方法:insert()、delete()、update()
5.对“查”,需要调用getReadableDatabase()获得一个可读的数据库对象,然后使用query()或rawQuery()方法 查询数据库不能使用execSQL方法

public class DBHelper extends SQLiteOpenHelper {
    private static final String DBname = "rocky.db";
 private static final int DBversion = 3;
 private static final String TAG = "DBHelper";
 /*参数说明:
 * 第一参数:上下文
 * 第二参数:数据库文件名称
 * 第三参数:null代表默认的游标工厂
 * 第四参数:数据库的版本号(数据库版本号只增不减)*/
 public DBHelper(Context context) {
        super(context, DBname, null, DBversion);
 }
    /*
 * 数据库创建的调用,只有在app第一次安装时才会调用这个方法
 * * 创建一个如果表不存在就创建它UserInfo
 * integer primary key autoincrement * varchar(20) 存储变长数据
 * char(10) 存储定长数据
 * text 存储可变长度的非Unicode数据*/
 @Override
 public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS UserInfo(_id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(20),phone varchar(20))");
 Log.d(TAG, "onCreate");
 }
    /*
 * 数据库升级是调用
 * 现在数据库版本是3,oldVersion 是2
 * 增加了一个字段category_id 类型text */
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d(TAG, "onUpgrade"+"oldVersion"+oldVersion+"newVersion"+newVersion);
 switch (oldVersion){
            case 2:
                db.execSQL("alter table UserInfo add category_id text");
 break; }
    }
}

二:创建数据访问接口Dao
1.什么是Dao
Dao(Data Access Object)是一个数据访问接口,加载业务逻辑与数据资源中间。Dao是把对数据库的操作全部封装在里面。Dao把底层的数据访问逻辑和高层的业务逻辑分开。

public class DemoDao {
    private DBHelper helper;
 public DemoDao(Context context) {
        helper = new DBHelper(context);
 }
    /*
 * 添加一条记录
 * name 联系人姓名
 * phone 联系人电话
 * return 返回是添加在数据库的行号 -1 代表失败*/
 public long add(String name, String phone, String category_id) {
        //获取操作数据库的实例,getWritableDatabase()磁盘满了,打开会报错,getReadableDatabase()磁盘满了,只会返回一个只读的数据库对象
 SQLiteDatabase db = helper.getWritableDatabase();
 ContentValues values = new ContentValues();
 values.put("name", name);
 values.put("phone", phone);
 values.put("category_id", category_id);
 //向表中插入一条数据
 long rowid = db.insert("UserInfo", null, values);
 //释放数据库资源
 db.close();
 return rowid;
 }
    /*
 * 根据姓名删除一条记录
 * name 要删除的联系人姓名
 * return 返回0代表没有删除任何记录,返回整形int 代表删除了几条数据*/
 public int delete(String name) {
        SQLiteDatabase db = helper.getWritableDatabase();
 int rowcount = db.delete("UserInfo", "name=?", new String[]{name});
 db.close();
 return rowcount;
 }
    /*
 * 修改联系人电话号码
 * new 新的电话号码
 * name 要修改的联系人姓名
 * return 0 代表一行也没有更新成功 >0 整数代表是更新了多少行记录*/
 public int update(String newphone, String name) {
        SQLiteDatabase db = helper.getWritableDatabase();
 ContentValues values = new ContentValues();
 values.put("phone", newphone);
 int rowcount = db.update("UserInfo", values, "name=?", new String[]{name});
 db.close();
 return rowcount;
 }
    /*
 * 查询联系人的电话号码
 * name 联系人
 * return 电话号码*/
 public String getPhoneNumber(String name) {
        String phone = null;
 SQLiteDatabase db = helper.getReadableDatabase();
 //Cursor
 Cursor cursor = db.query("UserInfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
 if (cursor.moveToNext()) {
            //如果光标可以移动到下一位,代表就是查询到了数据
 phone = cursor.getString(0);
 }
        cursor.close();
 db.close();
 return phone;
 }
    /*
 * * 获取所有的数据*/
 public String getAll(){
        String allTable ="";
 SQLiteDatabase db=helper.getReadableDatabase();
 Cursor cursor=db.rawQuery("select name from sqlite_master where type=\'table\' order by name",null);
 while (cursor.moveToNext()){
            //遍历出表名
 String name=cursor.getString(0);
 allTable+=name+".......";
 }
        return allTable;
 }
}

三:使用SQLiteOpenHelper在Application创建的时候创建,也可以在使用具体使用时候去创建

public class App extends Application {
    @Override
 public void onCreate() {
        super.onCreate();
 initSqlite();
 }
    private void initSqlite() {
        DBHelper dbHelper=new DBHelper(this);
 }
}

四:Activity的view点击使用执行具体相关操作

public class NineActivity extends AppCompatActivity {
    private DemoDao demoDao;
 private EditText mEtName;
 private EditText mEtPhone;
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_nine);
 mEtName=findViewById(R.id.mEtName);
 mEtPhone=findViewById(R.id.mEtPhone);
 demoDao=new DemoDao(this);
 }
    public void add(View view){
        String name=mEtName.getText().toString();
 String phone=mEtPhone.getText().toString();
 String category_id="dddd";
 long add=demoDao.add(name,phone,category_id);
 if (add!=-1){
            Toast.makeText(this,"添加成功"+add,Toast.LENGTH_LONG).show();
 }
    }
    public void delete(View view){
        String name = mEtName.getText().toString();
 int delete = demoDao.delete(name);
 if (delete != 0){
            Toast.makeText(this, "删除成功" + delete, Toast.LENGTH_LONG).show();
 }
    }
    public  void update(View view){
        String name=mEtName.getText().toString();
 String phone=mEtPhone.getText().toString();
 //根据phone更新name
 int update=demoDao.update(phone,name);
 if (update!=0){
            Toast.makeText(this,"更新成功"+update,Toast.LENGTH_LONG).show();
 }
    }
    public void query(View view){
        /*
 * 根据姓名查询手机号*/
 String name=mEtName.getText().toString();
 String phoneNumber=demoDao.getPhoneNumber(name);
 if (!TextUtils.isEmpty(phoneNumber)){
            Toast.makeText(this,"查询成功"+phoneNumber,Toast.LENGTH_LONG).show();
 }
        //查询所有表名
 /* String all=demoDao.getAll();
 if (!TextUtils.isEmpty(all)){ Toast.makeText(this,"查询成功---"+all,Toast.LENGTH_LONG).show();
 }*/
 }
}

五:针对SQLite查询语句相关参数

Cursor cursor = db.query("UserInfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);

query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:
1.table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
2.columns:要查询出来的列名。相当于select语句select关键字后面的部分。
3.selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
4.selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
5.groupBy:相当于select语句group by关键字后面的部分
6.having:相当于select语句having关键字后面的部分
7.orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
8.limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。
六:注意:
phone = cursor.getString(cursor.getColumnIndex("Phone"));//列明是phone,故原因是getColumnIndex区分大小写

 Caused by: java.lang.IllegalStateException: Couldn\'t read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
结尾:日就月将

以上是关于Android 自带的SQLite的原生数据库基本使用的主要内容,如果未能解决你的问题,请参考以下文章

Android内部自带的SQLite数据库操作dos命令

Android 原生 SQLite 数据库的一次封装实践

Android 原生 SQLite 数据库的一次封装实践

如何在android自带的sqlite3中创建一个数据库文件,请大虾门详细指导

Android 原生 SQLite 数据库的一次封装实践

Android原生实现多线程断点下载