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

来源:互联网 发布:mac pro 必备软件 编辑:程序博客网 时间:2024/06/06 12:29

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




目录(?)[-]

  1. 一背景
  2. 二具体情形
    1. 创建数据库
    2. 升级数据库
    3. 添加数据
    4. 函数原型inserttableName null ContentValues values
    5. 更新数据
    6. 函数原型updatetableName ContentValues values String arg3 String arg4
    7. 删除数据
    8. 查询数据
  3. 三参考代码
  4. 四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演示






目录(?)[-]

  1. 一背景
  2. 二具体情形
    1. 创建数据库
    2. 升级数据库
    3. 添加数据
    4. 函数原型inserttableName null ContentValues values
    5. 更新数据
    6. 函数原型updatetableName ContentValues values String arg3 String arg4
    7. 删除数据
    8. 查询数据
  3. 三参考代码
  4. 四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 0
原创粉丝点击