Android 提供了对 SQLite 数据库的完全支持。应用中的任何类(不包括应用外部的类)均可按名称访问您所创建的任何数据库。如果想让自己创建的数据库供外部应用使用,请使用 ContentProvider对外提供接口。SQLite 轻量级数据库使用方法如下:


欢迎关注微信公众号:程序员Android


微信公众号:ProgramAndroid


我们不是牛逼的程序员,我们只是程序开发中的垫脚石。


通过本章学习,你将掌握以下知识点

1. 继承SQLiteOpenHelper 创建数据库,数据表

  • 创建数据库表


  1. 语法


CREATE TABLE database_name.table_name(
  column1 datatype  PRIMARY KEY(one or more columns),
  column2 datatype,
  column3 datatype,
  .....
  columnN datatype,
);


  1. 举例


CREATE TABLE COMPANY(
  ID INT PRIMARY KEY     NOT NULL,
  NAME           TEXT    NOT NULL,
  AGE            INT     NOT NULL,
  ADDRESS        CHAR(50),
  SALARY         REAL
);


3.继承SQLiteDBHelper的创建数据库、数据表


  public SQLiteDBHelper(Context context) {
       super(context, DB_NAME, null, DB_VERSION);
   }

   @Override
   public void onCreate(SQLiteDatabase db) {

       // SQLite 数据库中,字段一般不区分类型,但是主键除外,主键必须是整型
       String sql = "CREATE TABLE " + TABLE_NAME + "(" + _ID
               + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" + "," + NAME
               + " CHAR(10)," + NICK_NAME + " CHAR(10))";
       db.execSQL(sql);
   }


4.删除数据库表


DROP TABLE IF EXITS TABLE_NAME;

2. 插入数据库数据

  • 插入数据方法一


  1. 语法


INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]  
VALUES (value1, value2, value3,...valueN);


  1. 举例


INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
  • 插入数据方法二


  1. 语法


INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);


  1. 举例


INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
  • Android 封装insert()插入数据方法三


1.语法


insert(String table, String nullColumnHack, ContentValues values)


2.举例


private SQLiteDatabase db;
db.insert(SQLiteDBHelper.TABLE_NAME, null, values);

3. 删除数据库数据

  • 删除数据库数据方法一


1.语法


DELETE FROM table_name 
WHERE [condition];


2.举例


DELETE FROM COMPANY WHERE ID = 7;
  • 2.Android封装删除数据库数据方法二


1.语法


delete(String table, String whereClause, String[] whereArgs)


举例


private SQLiteDatabase db;
db.delete(SQLiteDBHelper.TABLE_NAME, "name=?",
               new String[] { "Jack" });

4. 查询数据库数据

  • 查询数据库方法一


1.语法


SELECT column1, column2, columnN FROM table_name;

查询表中所有数据的方法

SELECT * FROM table_name;


2.举例


//1.查询指定的列
SELECT ID, NAME, SALARY FROM COMPANY;
// 2.查询表中所有内容
SELECT * FROM COMPANY;
  • Android 封装查询数据库方法二


1.语法


query(String table, String[] columns, String selection,
           String[] selectionArgs, String groupBy, String having,
           String orderBy)


2.举例


private SQLiteDatabase db;
Cursor cursor = db.query(SQLiteDBHelper.TABLE_NAME, null, null, null,
               null, null, null);

5. 修改数据库数据

  • 修改数据库方法一


1.语法


UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];


2.举例


UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;
  • Android update 封装修改数据库方法二


1.语法


update(String table, ContentValues values, String whereClause, String[] whereArgs)


2.举例


db.update(SQLiteDBHelper.TABLE_NAME, values, "nickname=?",
               new String[] { "J" });

6. 数据库使用Demo

  • 实现效果

数据库增删改查

  • 创建数据库
public class SQLiteDBHelper extends SQLiteOpenHelper {
   public static String DB_NAME = "person.db";
   // version 必须大于1
   public static int DB_VERSION = 1;
   public static String TABLE_NAME = "person";
   public static String _ID = "_id";
   public static String NAME = "name";
   public  static String NICK_NAME = "nickname";

   /**
    * @param context
    * @param name
    * @param factory
    * @param version
    */
   public SQLiteDBHelper(Context context, String name, CursorFactory factory,
           int version) {
       super(context, name, factory, version);
       // TODO Auto-generated constructor stub
   }

   public SQLiteDBHelper(Context context) {
       super(context, DB_NAME, null, DB_VERSION);
   }

   @Override
   public void onCreate(SQLiteDatabase db) {

       // SQLite 数据库中,字段一般不区分类型,但是主键除外,主键必须是整型
       String sql = "CREATE TABLE " + TABLE_NAME + "(" + _ID
               + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" + "," + NAME
               + " CHAR(10)," + NICK_NAME + " CHAR(10))";
       db.execSQL(sql);
   }

   // 数据库升级的处理方法,
   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

       if (newVersion > oldVersion) {
           // 删除老的数据表,创建新表
           String dropsql = "DROP TABLE IF EXITS " +
                   TABLE_NAME;
           db.execSQL(dropsql);
           onCreate(db);
       }
   }

}
  • 数据库 增、删、改、查方法
public class SQLiteMethods extends Activity {
   private SQLiteDatabase db;
   private ListView listView;
   private SimpleCursorAdapter adapter;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_sqlite);
       SQLiteDBHelper helper = new SQLiteDBHelper(this);
       /****
        * 需要调用以下两个方法之一,数据库和表才能真正创建出来
        * 正常情况下,getReadableDatabase()和getWritableDatabase()得到结果是一样的
        * 非正常情况下,比如明确要求以只读的方式打开数据库,或者磁盘满了,此时getReadableDatabase得到的是只读的数据库
        * **/
       db = helper.getWritableDatabase();
       listView = (ListView) findViewById(R.id.lv);

       adapter = new SimpleCursorAdapter(this, R.layout.listview_sqlite_tv,
               null, new String[] { "name", "nickname" }, new int[] {
                       R.id.name, R.id.nickname },
               SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
       listView.setAdapter(adapter);

   }

   //
   public void InsertSQL(View view) {

       InstertDB();
       QueryDB();
   }

   /**
    * 插入数据处理方法
    */
   private void InstertDB() {
       ContentValues values = new ContentValues();
       values.put("name", "Jack");
       values.put("nickname", "J");

       // 返回值:最近插入的那一行的行号
       long result = db.insert(SQLiteDBHelper.TABLE_NAME, null, values);
       if (result > 0) {
           Toast.makeText(getApplicationContext(), "添加成功", Toast.LENGTH_SHORT)
                   .show();
       } else {
           Toast.makeText(getApplicationContext(), "添加失败", Toast.LENGTH_SHORT)
                   .show();
       }
   }

   public void QuarySQL(View view) {

       QueryDB();
   }

   /**
    * 查询数据处理方法
    */
   private void QueryDB() {
       // Select * from person where name= ?
       // db.rawQuery(s)
       // cursor 游标--》 结果集合
       // 当使用SimpleCusorAdapter 时候,cursor 这个记过里面 必须包含“_id”,这个字段
       // Cursor cursor = db.query(SQLiteDBHelper.TABLE_NAME, null, "name=?",
       // new String[] { "Jack" }, null, null, null);
       Cursor cursor = db.query(SQLiteDBHelper.TABLE_NAME, null, null, null,
               null, null, null);

       while (cursor.moveToNext()) {

           String name = cursor.getString(cursor.getColumnIndex("name"));
           String nickname = cursor.getString(cursor
                   .getColumnIndex("nickname"));
       }
       // 将一个新的cusor跟原有的custor 交换
       adapter.swapCursor(cursor);
       adapter.notifyDataSetChanged();
   }

   public void DeleteSQL(View view) {

       DeleteDb();
       QueryDB();

   }

   /**
    * 删除数据
    */
   private void DeleteDb() {
       int result = db.delete(SQLiteDBHelper.TABLE_NAME, "name=?",
               new String[] { "Jack" });
       if (result > 0) {
           Toast.makeText(getApplicationContext(), "删除成功", Toast.LENGTH_SHORT)
                   .show();
       } else {
           Toast.makeText(getApplicationContext(), "无Jack", Toast.LENGTH_SHORT)
                   .show();
       }
   }

   public void ModifySQL(View view) {

       UpdateDb();
       QueryDB();

   }

   /**
    * 修改数据
    */
   private void UpdateDb() {
       // update person set name="Kitty" where nickname="J"
       ContentValues values = new ContentValues();
       values.put("name", "Lucy");

       int result = db.update(SQLiteDBHelper.TABLE_NAME, values, "nickname=?",
               new String[] { "J" });

       if (result > 0) {
           QueryDB();
       }
   }
}
  • 布局如下
<?xml version="1.0" encoding="utf-8"?>
<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"
>

   <Button
       android:id="@+id/insertdata"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="InsertSQL"
       android:text="增加数据" />

   <Button
       android:id="@+id/deletedata"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="DeleteSQL"
       android:text="删除数据" />

   <Button
       android:id="@+id/quarydata"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="QuarySQL"
       android:text="查询数据" />

   <Button
       android:id="@+id/modifydata"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:onClick="ModifySQL"
       android:text="修改数据" />

   <ListView
       android:id="@+id/lv"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

</LinearLayout>
  • ListView item布局如下
<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
   android:gravity="center_vertical"
   android:orientation="horizontal"
   android:padding="10dp" >

   <TextView
       android:id="@+id/name"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:text="name" />

   <TextView
       android:id="@+id/nickname"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:text="nickname" />

</LinearLayout>

至此Android SQLite 数据库的使用方法已经基本结束。


欢迎关注微信公众号:程序员Android



微信公众号:ProgramAndroid


我们不是牛逼的程序员,我们只是程序开发中的垫脚石。