《第一行代码Android》学习总结第六章 SQLite数据库存储

        SQLite数据库是一款轻量级关系型数据库,运行速度很快,占用资源少,适用于移动设备,同时支持标准的SQL语法,支持数据库ACID事务。

        SQLite数据库支持integer(整型)、real(浮点型)、text(文本型)与blob(二进制)等数据类型。

一、创建数据库

        SQLite使用SQLiteOpenHelper类实现对数据库的创建与升级。SQLiteOpenHelper类是一个抽象类,当继承该类时需要重写onCreate()方法与onUpgrade()方法,同时在这两个方法内实现创建更新数据库的功能。

        SQLiteOpenHelper类内有两个实例方法都可实现创建和打开一个现有的数据库,并返回一个可对数据库读写操作的对象:

getReadableDatabase():当数据库不可写时,以只读的形式打开数据库。

getWritableDatabase():当数据库不可写时,出现异常。

SQLiteOpenHelper类的构造方法:

第一个参数:Context。

第二个参数:数据库名。

第三个参数:允许查询数据时返回一个自定义的Cursor,一般传入null。

第四个参数:当前数据库的版本号,用于对数据库的升级操作。

构建过程:

1、构建出SQLiteOpenHelper实例。

2、调用getReadableDatabase()方法或getWritableDatabase()方法创建数据库。

        此时数据库就会存放在/data/data/<package name>/databases/目录下。此时重写的onCreate()方法会得到执行,所以通常会在这里去处理一些创建表的逻辑。

1、新建MyDatabaseHelper类继承自SQLiteOpenHelper

public class MyDatabaseHelper extends SQLiteOpenHelper {
//建表语句定义为一串字符串
    public static final String CREATE_BOOK = "create table Book ("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";
    private Context mContext;
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // execSQL()方法用于执行SQL语句
        sqLiteDatabase.execSQL(CREATE_BOOK);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
}

2、修改activity_main.xml中的代码,加入一个Button用于创建数据库。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create Batabase"/>
</LinearLayout>

3、修改MainActivity。

public class MainActivity extends AppCompatActivity {
    private MyDatabaseHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//构建SQLiteOpenHelper实例,指定版本号为1
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//创建数据库
                myDatabaseHelper.getWritableDatabase();
            }
        });
   }
}

        当第一次点击createDatabase按钮时,当前程序会检测系统中是否存在BookStore.db文件,若不存在创建数据库并调用MyDatabaseHelper中的onCreate()方法,创建Book表,弹出Toast提示创建成功。当创建成功时,系统中已存在BookStore.db文件,再次点击按钮不会再创建一次。

二、升级数据库

        onUpdate()方法用于对数据库进行升级。

1、添加Category表到MyDatabaseHelper中,加入新的建表语句并执行。

public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "create table Book ("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";
    public static final String CREATE_CATEGORY = "create table Category ("
            + "id integer primary key autoincrement, "
            + "category_name text, "
            + "category_code integer)";
    private Context mContext;
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_BOOK);
        sqLiteDatabase.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
}

2、运用SQLiteOpenHelper的升级功能。

 @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("drop table if exists Book");
        sqLiteDatabase.execSQL("drop table if exists Category");
        onCreate(sqLiteDatabase);
}

3、在MainActivity中修改MyDatabaseHelper中构造函数的版本号,让onUpgrade()方法得以执行。

public class MainActivity extends AppCompatActivity {
    private MyDatabaseHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//将MyDatabaseHelper中构造方法的版本号从1改为2
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myDatabaseHelper.getWritableDatabase();
            }
        });
  }
}

三、添加数据

        当调用SQLiteOpenHelper的getReadableDatabase()方法或getWritableDatabase()方法不仅可以用于创建和升级数据库,同时该方法会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行CRUD操作了。

        SQLiteDatabase提供了insert()方法专门用于添加数据。

第一个参数:数据库表名

第二个参数:在未指定添加数据的情况下给某个可为空的列自动赋值null,一般传入null

第三个参数:ContentValues对象,它提供了一系列put()方法重载,用于向ContentValues中添加数据,只需将将表中列名与待添加数据传入即可。

1、修改activity_mian中代码,添加Button按钮用于添加数据。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ……
    <Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add Data"/>
</LinearLayout>

2、修改MainActivity中代码。

public class MainActivity extends AppCompatActivity {
    private MyDatabaseHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
        ……
        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//获取SQLiteDatabase对象
                SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
//组装数据
                contentValues.put("name","The Da Vinci Code");
                contentValues.put("author","Dan Brown");
                contentValues.put("pages",454);
                contentValues.put("price",16.96);
//添加数据
                sqLiteDatabase.insert("Book",null,contentValues);
//添加下一组数据前需要清空ContentValues
                contentValues.clear();

                contentValues.put("name","The Lost Symbol");
                contentValues.put("author","Dan Brown");
                contentValues.put("pages",510);
                contentValues.put("price",19.95);
                sqLiteDatabase.insert("Book",null,contentValues);
            }
        });
   }
}

四、更新数据

        SQLiteDatabase提供了update()方法专门用于更新数据。

第一个参数:表名

第二个参数:ContentValues对象,只需更新的数据组装进去。

第三、四个参数:用于约束更新某一行或某几行的数据,不指定则默认更新所有。

1、修改activity_main.xml,添加按钮更新数据。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    ……
    <Button
        android:id="@+id/update_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update Data"/>
</LinearLayout>

2、修改MainActivity中代码。

public class MainActivity extends AppCompatActivity {
    private MyDatabaseHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
        ……
        Button updateData = (Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
//修改price价格
                contentValues.put("price",10.99);
//更新代码,其中第三个参数为SQL语句中where的部分,第四个参数为第三个参数占位符所指代的内容。
                sqLiteDatabase.update("Book",contentValues,"name = ?",new String[]{"The Da Vinci Code"});
            }
        });
}
}

五、删除数据

        SQLiteDatabase提供了delete()方法专门用于删除数据。

第一个参数:表名

第二、三个参数:用于约束更新某一行或某几行的数据,不指定则默认删除所有。

1、修改activity_main.xml,添加按钮删除数据。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ……
    <Button
        android:id="@+id/delete_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete Data"/>
</LinearLayout>

2、修改MainActivity中代码。

public class MainActivity extends AppCompatActivity {
    private MyDatabaseHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
        ……
        Button deleteData = (Button) findViewById(R.id.delete_data);
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
//指定删除页数超过500的书
                sqLiteDatabase.delete("Book","pages > ?",new String[]{"500"});
            }
        });
   }
}

六、查询数据

        SQLiteDatabase提供了query()方法专门用于查询数据。

第一个参数:查询的表名。

第二个参数:指定查询哪几列,不指定则查询所有。

第三个参数:指定where的约束条件。

第四个参数:为where的占位符提供具体的值。

第五个参数:指定需要的group by的列。

第六个参数:对group by后的结果进行进一步过滤。

第七个参数:指定查询结果的排序方式。

1、修改activity_main.xml,添加按钮删除数据。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ……
    <Button
        android:id="@+id/query_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Query Data"/>
</LinearLayout>

2、修改MainActivity中代码。

public class MainActivity extends AppCompatActivity {
    private MyDatabaseHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
        …….
        Button queryData = (Button) findViewById(R.id.query_data);
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase sqLiteDatabase = myDatabaseHelper.getWritableDatabase();
//查询语句。
                Cursor cursor = sqLiteDatabase.query("Book",null,null,null,null,null,null);
//将数据的指针移动到第一行位置。
                if(cursor.moveToFirst()){
                    do{
// getColumnIndex()方法获取某一列在表中对应位置索引
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        int pages =cursor.getInt(cursor.getColumnIndex("pages"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));
                        Log.d("MainActivity", "book name is " + name);
                        Log.d("MainActivity", "book author is " + author);
                        Log.d("MainActivity", "book pages is " + pages);
                        Log.d("MainActivity", "book price is " + price);
                    }while(cursor.moveToNext());
//使用结束时调用close()方式关闭Cursor
                    cursor.close();
                }
            }
        });
    }
}

七、使用SQL操作数据库。

        Android同样支持直接使用SQL来操作数据库。可运用rawQuery()方法查询数据和execSQL()方法进行其他操作。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值