学习笔记:Android SQLite,并实现SQLite基本CRUD操作的Demo

转载地址:http://blog.csdn.net/jinxin_cuit/article/details/52608732




一、背景

      Android系统内置有SQLite,用户可以在本地存放大量较为复杂的关系型数据,相较于File操作和SharedPreferences只能存放简单的数据,SQLite具有更大的优势。

      Android的SQLite使用有两种方式:一是直接使用Android 为SQLite封装好的API函数insert/delete/update/query;二是使用原生的SQLite语句。



二、具体情形

1.创建数据库

      Android提供了一个叫SQLiteOpenHelper的抽象类,用来创建和升级数据库,其中包含两个抽象方法onCreate()和onUpgrade(),意味着我们在自定义MySQLiteOpenHelper类的时候必须去复写这两个方法,同时还必须复写构造函数。

      另外,该类还包括getReadableDatabase()和getWritableDatabase(),两者都可以创建或者打开一个数据库,并返回一个具有可读可写权限的SQLiteDatabase对象。唯一区别在于:当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

      当调用SQLiteOpenHelper实例的getReadableDatabase()或者getWritableDatabase()方法时,如果之前没有改数据库,则会首先调用SQLiteOpenHelper实例的复写的onCreate方法去创建一个数据库(表),然后打开并返回创建好的该数据库,执行后续操作。


SQLiteOpenHelper需要复写的函数:

1)构造函数:public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version),四个参数依次为Context实例,要创建的数据库名称,null,当前数据库版本;

2)数据库创建函数: public void onCreate(SQLiteDatabase db),参数是要创建的数据库

3)数据库升级函数:public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),参数分别是要升级的数据库,上一版本,最新版本。当调用构造函数MyDatabaseHelper时,version号大于之前的version号,该函数将被调用



2.升级数据库

      比如说,我们需要在当前数据库的基础上新增或者删除一个表,而不需要在构造函数MyDatabaseHelper()当中的参数version传入大于上一次的版本号,那么则会调用onUpgrade()函数,在该函数里面去实现升级的操作。


至此,我们已经学会创建和升级数据库,接着要做的事情就是对该空白的数据库进行增删改查CRUD

3.添加数据:

函数原型:insert("tableName", null, ContentValues values)

参数:第一个是表名,第三个是ContenValues对象


给数据库插入数据时,我们需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,然后通过insert()方法来实现添加数据。




4.更新数据:

函数原型:update("tableName", ContentValues values, String arg3, String arg4)

参数: 第一个是表名,第二个是ContenValues对象,第三和第四个参数是限定条件,更新哪些行数据

数据库更新数据时,我们也需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,同时结合限定条件,确定要更新的数据行,然后通过update()方法来实现更新数据。



5.删除数据

函数原型:delete( "tableName",  String arg2, String arg3 )
参数:第一个是表名,第二个和第三个是限定条件,确定删除哪些行数据。

删除数据库数据时,我们只需要表名和要输出的数据行限定条件就OK。



6.查询数据

查询表中全部数据:query("tableName", null, null, null, null, null, null)
参数:第一个是表名,其他六个参数填null,表示查询表中全部数据
返回值:Cursor对象
利用cursor.moveToFirst()移动表的第一个数据位置;利用cursor.moveToNext()函数去遍历下一行数据。最后需要关闭cursor.close()。



三、参考代码


MySQLiteOpenHelper:去继承SQLiteOpenHelper,并复写构造函数、onCreate()、onUpgrade(),实现数据库的创建和升级

[java]  view plain  copy
  1. package com.steven.mydatabasetest;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6. import android.widget.Toast;  
  7.   
  8. /** 
  9.  * Created by Steven on 2016/9/20. 
  10.  */  
  11. public class MySQLiteOpenHelper extends SQLiteOpenHelper {  
  12.   
  13.     //定义一个创建表Book的SQLite语句  
  14.     private static final String CREATE_BOOK = "create table Book("  
  15.             + "id integer primary key autoincrement, "  
  16.             + "author text,"  
  17.             + "price real, "  
  18.             + "pages integer, "  
  19.             + "name text)";  
  20.   
  21.     //定义一个创建表Category的SQLite语句  
  22.     private static final String CREATE_CATEGORY = "create table Category("  
  23.             + "id integer primary key autoincrement, "  
  24.             + "category_name text, "  
  25.             + "category_code integer)";  
  26.   
  27.     private Context mContext;  
  28.   
  29.     public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {  
  30.         super(context, name, factory, version);  
  31.         mContext = context;     //获取Context实例  
  32.     }  
  33.   
  34.   
  35.     @Override  
  36.     public void onCreate(SQLiteDatabase db) {  
  37.         db.execSQL(CREATE_BOOK);  
  38.         db.execSQL(CREATE_CATEGORY);  
  39.         Toast.makeText(mContext, "成功创建Database", Toast.LENGTH_SHORT).show();  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onUpgrade(SQLiteDatabase db, int i, int i1) {  
  44.         db.execSQL("drop table if exists Book");        //如果存在表Book,则删除该表  
  45.         db.execSQL("drop table if exists Category");    //如果存在表Category,则删除该表  
  46.         onCreate(db);       //重新调用onCreate(),创建两张表  
  47.     }  
  48. }  




MainActivity:创建数据库,并且实现对数据库的相关操作CRUD
[java]  view plain  copy
  1. package com.steven.mydatabasetest;  
  2.   
  3. import android.content.ContentValues;  
  4. import android.database.Cursor;  
  5. import android.database.sqlite.SQLiteDatabase;  
  6. import android.os.Bundle;  
  7. import android.support.v7.app.AppCompatActivity;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11. import android.widget.Toast;  
  12.   
  13. public class MainActivity extends AppCompatActivity implements View.OnClickListener{  
  14.   
  15.     private Button btnCreateDatabase;  
  16.     private Button btnInsertData;  
  17.     private Button btnUpdateData;  
  18.     private Button btnDeleteData;  
  19.     private Button btnQueryData;  
  20.     private MySQLiteOpenHelper dbHelper;  
  21.     private static final String TAG = "Steven";  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.         //调用构造函数,指明要创建的数据库名字以及版本号  
  28.         dbHelper = new MySQLiteOpenHelper(MainActivity.this,"BookStore.db"null5);  
  29.   
  30.         //1.创建数据库  
  31.         btnCreateDatabase = (Button)findViewById(R.id.btn_create_database);  
  32.         btnCreateDatabase.setOnClickListener(this);  
  33.         //2.插入数据  
  34.         btnInsertData = (Button)findViewById(R.id.btn_insert_data);  
  35.         btnInsertData.setOnClickListener(this);  
  36.         //3.修改数据  
  37.         btnUpdateData = (Button)findViewById(R.id.btn_update_data);  
  38.         btnUpdateData.setOnClickListener(this);  
  39.         //4.删除数据  
  40.         btnDeleteData = (Button)findViewById(R.id.btn_delete_data);  
  41.         btnDeleteData.setOnClickListener(this);  
  42.         //5.查询数据  
  43.         btnQueryData = (Button)findViewById(R.id.btn_query_data);  
  44.         btnQueryData.setOnClickListener(this);  
  45.     }  
  46.   
  47.     @Override  
  48.     public void onClick(View view) {  
  49.         switch (view.getId()){  
  50.   
  51.             // 1.创建并打开数据库BookStore.db,回调MySQLiteOpenHelper类中的onCreate()方法创建表  
  52.             case R.id.btn_create_database:  
  53.                 dbHelper.getWritableDatabase();  
  54.                 break;  
  55.   
  56.             // 2.向表中插入数据: insert  
  57.             case R.id.btn_insert_data:  
  58.                 SQLiteDatabase db = dbHelper.getWritableDatabase(); //获取返回的SQLiteDatabase对象  
  59.   
  60.                 ContentValues contentValues = new ContentValues();  
  61.   
  62.                 //组装数据  
  63.                 contentValues.put("name","第一行代码");  
  64.                 contentValues.put("author","郭霖");  
  65.                 contentValues.put("pages"552);  
  66.                 contentValues.put("price",79.0);  
  67.                 db.insert("Book"null, contentValues); //向表Book中插入一条数据  
  68.                 contentValues.clear();  
  69.   
  70.                 //组装数据  
  71.                 contentValues.put("name","第二行代码");  
  72.                 contentValues.put("author","郭霖");  
  73.                 contentValues.put("pages"662);  
  74.                 contentValues.put("price",89.0);  
  75.                 db.insert("Book"null, contentValues); //向表Book中插入第二条数据  
  76.                 Toast.makeText(this"成功插入数据", Toast.LENGTH_SHORT).show();  
  77.                 break;  
  78.   
  79.             // 3.修改数据: update  
  80.             case R.id.btn_update_data:  
  81.                 SQLiteDatabase db1 = dbHelper.getWritableDatabase();  
  82.                 ContentValues contentValues1 = new ContentValues();  
  83.                 contentValues1.put("name""第三行代码");  
  84.                 db1.update("Book", contentValues1,"name = ?",new String[]{"第二行代码"});  
  85.                 Toast.makeText(this"成功修改数据", Toast.LENGTH_SHORT).show();  
  86.                 break;  
  87.   
  88.             // 4.删除数据:delete  
  89.             case R.id.btn_delete_data:  
  90.                 SQLiteDatabase db2 = dbHelper.getWritableDatabase();  
  91.                 db2.delete("Book""pages > ?"new String[]{"600"});  
  92.                 Toast.makeText(this"成功删除一条数据", Toast.LENGTH_SHORT).show();  
  93.                 break;  
  94.   
  95.             // 5.查询数据: query  
  96.             case R.id.btn_query_data:  
  97.                 SQLiteDatabase db3 = dbHelper.getWritableDatabase();  
  98.                 Cursor cursor = db3.query("Book"nullnullnullnullnullnull);  
  99.                 //查询表中所有数据  
  100.                 if(cursor.moveToFirst()){  
  101.                     //遍历Cursor对象,取出数据  
  102.                     do{  
  103.                         String name = cursor.getString(cursor.getColumnIndex("name"));  
  104.                         String author = cursor.getString(cursor.getColumnIndex("author"));  
  105.                         int pages = cursor.getInt(cursor.getColumnIndex("pages"));  
  106.                         double price = cursor.getDouble(cursor.getColumnIndex("price"));  
  107.   
  108.                         Log.d(TAG,"Book name: " + name);  
  109.                         Log.d(TAG,"Book author: " + author);  
  110.                         Log.d(TAG,"Book pages: " + pages);  
  111.                         Log.d(TAG,"Book price: " + price);  
  112.                     }while(cursor.moveToNext());  
  113.                     cursor.close();  
  114.                 }  
  115.                 Toast.makeText(this"查询出表中全部数据", Toast.LENGTH_SHORT).show();  
  116.                 break;  
  117.             default:  
  118.                 break;  
  119.         }  
  120.     }  
  121. }  


四、Demo演示






一、背景

      Android系统内置有SQLite,用户可以在本地存放大量较为复杂的关系型数据,相较于File操作和SharedPreferences只能存放简单的数据,SQLite具有更大的优势。

      Android的SQLite使用有两种方式:一是直接使用Android 为SQLite封装好的API函数insert/delete/update/query;二是使用原生的SQLite语句。



二、具体情形

1.创建数据库

      Android提供了一个叫SQLiteOpenHelper的抽象类,用来创建和升级数据库,其中包含两个抽象方法onCreate()和onUpgrade(),意味着我们在自定义MySQLiteOpenHelper类的时候必须去复写这两个方法,同时还必须复写构造函数。

      另外,该类还包括getReadableDatabase()和getWritableDatabase(),两者都可以创建或者打开一个数据库,并返回一个具有可读可写权限的SQLiteDatabase对象。唯一区别在于:当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

      当调用SQLiteOpenHelper实例的getReadableDatabase()或者getWritableDatabase()方法时,如果之前没有改数据库,则会首先调用SQLiteOpenHelper实例的复写的onCreate方法去创建一个数据库(表),然后打开并返回创建好的该数据库,执行后续操作。


SQLiteOpenHelper需要复写的函数:

1)构造函数:public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version),四个参数依次为Context实例,要创建的数据库名称,null,当前数据库版本;

2)数据库创建函数: public void onCreate(SQLiteDatabase db),参数是要创建的数据库

3)数据库升级函数:public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),参数分别是要升级的数据库,上一版本,最新版本。当调用构造函数MyDatabaseHelper时,version号大于之前的version号,该函数将被调用



2.升级数据库

      比如说,我们需要在当前数据库的基础上新增或者删除一个表,而不需要在构造函数MyDatabaseHelper()当中的参数version传入大于上一次的版本号,那么则会调用onUpgrade()函数,在该函数里面去实现升级的操作。


至此,我们已经学会创建和升级数据库,接着要做的事情就是对该空白的数据库进行增删改查CRUD

3.添加数据:

函数原型:insert("tableName", null, ContentValues values)

参数:第一个是表名,第三个是ContenValues对象


给数据库插入数据时,我们需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,然后通过insert()方法来实现添加数据。




4.更新数据:

函数原型:update("tableName", ContentValues values, String arg3, String arg4)

参数: 第一个是表名,第二个是ContenValues对象,第三和第四个参数是限定条件,更新哪些行数据

数据库更新数据时,我们也需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,同时结合限定条件,确定要更新的数据行,然后通过update()方法来实现更新数据。



5.删除数据

函数原型:delete( "tableName",  String arg2, String arg3 )
参数:第一个是表名,第二个和第三个是限定条件,确定删除哪些行数据。

删除数据库数据时,我们只需要表名和要输出的数据行限定条件就OK。



6.查询数据

查询表中全部数据:query("tableName", null, null, null, null, null, null)
参数:第一个是表名,其他六个参数填null,表示查询表中全部数据
返回值:Cursor对象
利用cursor.moveToFirst()移动表的第一个数据位置;利用cursor.moveToNext()函数去遍历下一行数据。最后需要关闭cursor.close()。



三、参考代码


MySQLiteOpenHelper:去继承SQLiteOpenHelper,并复写构造函数、onCreate()、onUpgrade(),实现数据库的创建和升级

[java]  view plain  copy
  1. package com.steven.mydatabasetest;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6. import android.widget.Toast;  
  7.   
  8. /** 
  9.  * Created by Steven on 2016/9/20. 
  10.  */  
  11. public class MySQLiteOpenHelper extends SQLiteOpenHelper {  
  12.   
  13.     //定义一个创建表Book的SQLite语句  
  14.     private static final String CREATE_BOOK = "create table Book("  
  15.             + "id integer primary key autoincrement, "  
  16.             + "author text,"  
  17.             + "price real, "  
  18.             + "pages integer, "  
  19.             + "name text)";  
  20.   
  21.     //定义一个创建表Category的SQLite语句  
  22.     private static final String CREATE_CATEGORY = "create table Category("  
  23.             + "id integer primary key autoincrement, "  
  24.             + "category_name text, "  
  25.             + "category_code integer)";  
  26.   
  27.     private Context mContext;  
  28.   
  29.     public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {  
  30.         super(context, name, factory, version);  
  31.         mContext = context;     //获取Context实例  
  32.     }  
  33.   
  34.   
  35.     @Override  
  36.     public void onCreate(SQLiteDatabase db) {  
  37.         db.execSQL(CREATE_BOOK);  
  38.         db.execSQL(CREATE_CATEGORY);  
  39.         Toast.makeText(mContext, "成功创建Database", Toast.LENGTH_SHORT).show();  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onUpgrade(SQLiteDatabase db, int i, int i1) {  
  44.         db.execSQL("drop table if exists Book");        //如果存在表Book,则删除该表  
  45.         db.execSQL("drop table if exists Category");    //如果存在表Category,则删除该表  
  46.         onCreate(db);       //重新调用onCreate(),创建两张表  
  47.     }  
  48. }  




MainActivity:创建数据库,并且实现对数据库的相关操作CRUD
[java]  view plain  copy
  1. package com.steven.mydatabasetest;  
  2.   
  3. import android.content.ContentValues;  
  4. import android.database.Cursor;  
  5. import android.database.sqlite.SQLiteDatabase;  
  6. import android.os.Bundle;  
  7. import android.support.v7.app.AppCompatActivity;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11. import android.widget.Toast;  
  12.   
  13. public class MainActivity extends AppCompatActivity implements View.OnClickListener{  
  14.   
  15.     private Button btnCreateDatabase;  
  16.     private Button btnInsertData;  
  17.     private Button btnUpdateData;  
  18.     private Button btnDeleteData;  
  19.     private Button btnQueryData;  
  20.     private MySQLiteOpenHelper dbHelper;  
  21.     private static final String TAG = "Steven";  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.         //调用构造函数,指明要创建的数据库名字以及版本号  
  28.         dbHelper = new MySQLiteOpenHelper(MainActivity.this,"BookStore.db"null5);  
  29.   
  30.         //1.创建数据库  
  31.         btnCreateDatabase = (Button)findViewById(R.id.btn_create_database);  
  32.         btnCreateDatabase.setOnClickListener(this);  
  33.         //2.插入数据  
  34.         btnInsertData = (Button)findViewById(R.id.btn_insert_data);  
  35.         btnInsertData.setOnClickListener(this);  
  36.         //3.修改数据  
  37.         btnUpdateData = (Button)findViewById(R.id.btn_update_data);  
  38.         btnUpdateData.setOnClickListener(this);  
  39.         //4.删除数据  
  40.         btnDeleteData = (Button)findViewById(R.id.btn_delete_data);  
  41.         btnDeleteData.setOnClickListener(this);  
  42.         //5.查询数据  
  43.         btnQueryData = (Button)findViewById(R.id.btn_query_data);  
  44.         btnQueryData.setOnClickListener(this);  
  45.     }  
  46.   
  47.     @Override  
  48.     public void onClick(View view) {  
  49.         switch (view.getId()){  
  50.   
  51.             // 1.创建并打开数据库BookStore.db,回调MySQLiteOpenHelper类中的onCreate()方法创建表  
  52.             case R.id.btn_create_database:  
  53.                 dbHelper.getWritableDatabase();  
  54.                 break;  
  55.   
  56.             // 2.向表中插入数据: insert  
  57.             case R.id.btn_insert_data:  
  58.                 SQLiteDatabase db = dbHelper.getWritableDatabase(); //获取返回的SQLiteDatabase对象  
  59.   
  60.                 ContentValues contentValues = new ContentValues();  
  61.   
  62.                 //组装数据  
  63.                 contentValues.put("name","第一行代码");  
  64.                 contentValues.put("author","郭霖");  
  65.                 contentValues.put("pages"552);  
  66.                 contentValues.put("price",79.0);  
  67.                 db.insert("Book"null, contentValues); //向表Book中插入一条数据  
  68.                 contentValues.clear();  
  69.   
  70.                 //组装数据  
  71.                 contentValues.put("name","第二行代码");  
  72.                 contentValues.put("author","郭霖");  
  73.                 contentValues.put("pages"662);  
  74.                 contentValues.put("price",89.0);  
  75.                 db.insert("Book"null, contentValues); //向表Book中插入第二条数据  
  76.                 Toast.makeText(this"成功插入数据", Toast.LENGTH_SHORT).show();  
  77.                 break;  
  78.   
  79.             // 3.修改数据: update  
  80.             case R.id.btn_update_data:  
  81.                 SQLiteDatabase db1 = dbHelper.getWritableDatabase();  
  82.                 ContentValues contentValues1 = new ContentValues();  
  83.                 contentValues1.put("name""第三行代码");  
  84.                 db1.update("Book", contentValues1,"name = ?",new String[]{"第二行代码"});  
  85.                 Toast.makeText(this"成功修改数据", Toast.LENGTH_SHORT).show();  
  86.                 break;  
  87.   
  88.             // 4.删除数据:delete  
  89.             case R.id.btn_delete_data:  
  90.                 SQLiteDatabase db2 = dbHelper.getWritableDatabase();  
  91.                 db2.delete("Book""pages > ?"new String[]{"600"});  
  92.                 Toast.makeText(this"成功删除一条数据", Toast.LENGTH_SHORT).show();  
  93.                 break;  
  94.   
  95.             // 5.查询数据: query  
  96.             case R.id.btn_query_data:  
  97.                 SQLiteDatabase db3 = dbHelper.getWritableDatabase();  
  98.                 Cursor cursor = db3.query("Book"nullnullnullnullnullnull);  
  99.                 //查询表中所有数据  
  100.                 if(cursor.moveToFirst()){  
  101.                     //遍历Cursor对象,取出数据  
  102.                     do{  
  103.                         String name = cursor.getString(cursor.getColumnIndex("name"));  
  104.                         String author = cursor.getString(cursor.getColumnIndex("author"));  
  105.                         int pages = cursor.getInt(cursor.getColumnIndex("pages"));  
  106.                         double price = cursor.getDouble(cursor.getColumnIndex("price"));  
  107.   
  108.                         Log.d(TAG,"Book name: " + name);  
  109.                         Log.d(TAG,"Book author: " + author);  
  110.                         Log.d(TAG,"Book pages: " + pages);  
  111.                         Log.d(TAG,"Book price: " + price);  
  112.                     }while(cursor.moveToNext());  
  113.                     cursor.close();  
  114.                 }  
  115.                 Toast.makeText(this"查询出表中全部数据", Toast.LENGTH_SHORT).show();  
  116.                 break;  
  117.             default:  
  118.                 break;  
  119.         }  
  120.     }  
  121. }  


四、Demo演示



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值