Android Studio新手开发第十九天

目录

数据库

1.SQLite数据库

1.1数据库管理器SQLiteDatabase

1.2数据库帮助器SQLiteOpenHelper


数据库

        在Android中,数据库存储主要有两种方式:一种是使用原生的SQLite数据库,另一种是使用Room持久化库(它是SQLite的抽象层,提供了更安全和方便的API),本章主要讲原生的SQLite数据库。

1.SQLite数据库

        SQLite是Android内置的轻量级关系型数据库,它支持标准的SQL语法和ACID事务。每个数据库都是设备上的一个文件,通常位于应用沙盒内,只有应用本身可以访问。

        SQLite数据库的基础语法可以参考下列链接。

第五章 SQLite数据库:1、SQLite 基础语法及使用案例

1.1数据库管理器SQLiteDatabase

        SQLiteDataBase是Android提供的SQLite数据库管理器,可以在Java代码中调用方法openOrCreateDatabase来获取数据库实例。如下方的示例代码:布局文件中设置两个按钮,一个文本视图。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Storage.DataBaseActivity"
    android:orientation="vertical">


    <Button
        android:id="@+id/button_create"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建数据库"/>
    <Button
        android:id="@+id/button_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除数据库"/>

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="" />
</LinearLayout>

        部分Java代码,主要是按钮监听器中的逻辑处理。

    @Override
    public void onClick(View view) {
        if(view.getId() == R.id.button_create){
            SQLiteDatabase sqLiteDatabase = openOrCreateDatabase( getFilesDir()+"/mySQLiteDatabase.bd",MODE_PRIVATE,null);
//下面这种方式也可以创建数据库
// SQLiteDatabase sqLiteDatabase = SQLiteDatabase.openDatabase(getFilesDir() + "/mydatabse.bd",null, SQLiteDatabase.CREATE_IF_NECESSARY);

            String string = String.format("%s\n数据库%s创建%s!",textView.getText(),sqLiteDatabase.getPath(),(sqLiteDatabase != null) ? "成功":"失败");
            textView.setText(string);
        }
        else{
            boolean is_delete = deleteDatabase(getFilesDir() + "/mySQLiteDatabase.bd");
            textView.setText(textView.getText() + String.format("\n数据库删除%s",is_delete?"成功":"失败"));
        }
    }

        效果图如下,一次点击两个按钮,先创建数据库后删除数据库。

        根据路径可以查看到对应的数据库所在。

1.2数据库帮助器SQLiteOpenHelper

        对于数据库管理器其实存在局限性,有时候会重复打开数据库,处理数据库的升级也不方便。对此Android提供了数据库帮助器SQLIteOpenHelper,帮助开发者更合理使用SQLite。SQLIteOpenHelper类中有两个方法,onCreate方法只在第一次打开数据库连接时调用,在这里可以创建表结构;onUpgrade方法在数据库版本升高时调用,在这里可以更据版本变化修改表结构。示例代码如下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Storage.DataBaseActivity">

    <EditText
        android:id="@+id/editText_Name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Name"
        android:inputType="text" />

    <EditText
        android:id="@+id/editText_Age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Age"
        android:inputType="number" />


    <RadioGroup
        android:id="@+id/radioGroup_gender"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/radio_male"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="男" />

        <RadioButton
            android:id="@+id/radio_female"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="女" />

        <RadioButton
            android:id="@+id/radio_other"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:checked="true"
            android:text="其他" />
    </RadioGroup>

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnCount="3"
        android:rowCount="2">
        <Button
            android:id="@+id/button_Add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:text="添加" />

        <Button
            android:id="@+id/button_Write"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:text="提交" />

        <Button
            android:id="@+id/button_Read"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:text="读取" />

        <Button
            android:id="@+id/button_Delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:text="删除" />

        <Button
            android:id="@+id/button_DeleteAll"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:text="删除全部" />

        <Button
            android:id="@+id/button_Update"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:text="更新" />

    </GridLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="读取结果:\n" />
    </ScrollView>

</LinearLayout>

        UserInfo类的Java代码。

public class UserInfo {
    private long _id;
    private String Name;
    private int Age;
    private String gender;
    private String time;

    public long get_id() {
        return _id;
    }

    public void set_id(long _id) {
        this._id = _id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public int getAge() {
        return Age;
    }

    public void setAge(int age) {
        Age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}

        自定义数据库帮助器类的Java代码。



public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    private static MySQLiteOpenHelper mySQLiteOpenHelper = null;//数据库帮助器的实例
    private static SQLiteDatabase sqLiteDatabase = null;//数据库的实例
    private static String DataBaseName;//数据库名
    private static String TableName;//表名

    public static MySQLiteOpenHelper getInstance(Context context, int version, String databaseName, String tableName) {
        if (version > 0 && mySQLiteOpenHelper == null) {
            mySQLiteOpenHelper = new MySQLiteOpenHelper(context, version, databaseName);
            DataBaseName = databaseName;
            TableName = tableName;
        }
        return mySQLiteOpenHelper;
    }

    private MySQLiteOpenHelper(Context context, int version, String dataBaseName) {
        super(context, dataBaseName, null, version);
    }

    //开启读取连接
    public SQLiteDatabase openReadLink() {
        if (sqLiteDatabase == null || !sqLiteDatabase.isOpen()) {
            sqLiteDatabase = mySQLiteOpenHelper.getReadableDatabase();
        }
        return sqLiteDatabase;
    }

    //开启写入连接
    public SQLiteDatabase openWriteLink() {
        if (sqLiteDatabase == null || !sqLiteDatabase.isOpen()) {
            sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
        }
        return sqLiteDatabase;
    }

    //关闭连接
    public void closeLink() {
        if (sqLiteDatabase != null && sqLiteDatabase.isOpen()) {
            sqLiteDatabase.close();
            sqLiteDatabase = null;
        }
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //建表SQL语句
        String create_table_sql = "CREATE TABLE IF NOT EXISTS " + TableName +
                " (" + "_id INTEGER PRIMARY KEY  AUTOINCREMENT NOT NULL,"//主键
                + "name VARCHAR NOT NULL," + "age INTEGER NOT NULL,"//名字、年龄
                + "gender VARCHAR NOT NULL," + "update_time VARCHAR NOT NULL" + ");";//性别、添加或更新时间
        sqLiteDatabase.execSQL(create_table_sql); // 执行完整的SQL语句
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersoin, int newVersion) {
    }
    //查询
    public List<UserInfo> query(String tableName,String condition){
        String query_sql = String.format( "SELECT * FROM %s WHERE %s",tableName,condition);
        Cursor cursor = sqLiteDatabase.rawQuery(query_sql,null);
        List<UserInfo> userInfoList = new ArrayList<UserInfo>();
        while (cursor.moveToNext()){
            UserInfo userInfo = new UserInfo();
            userInfo.set_id(cursor.getLong(0));
            userInfo.setName(cursor.getString(1));
            userInfo.setAge(cursor.getInt(2));
            userInfo.setGender(cursor.getString(3));
            userInfo.setTime(cursor.getString(4));
            userInfoList.add(userInfo);
        }
        cursor.close();
        return userInfoList;
    }

    //增加记录
    public long insert(List<UserInfo> userInfoList,String tableName){
        long result = -1;
        for(int i = 0; i < userInfoList.size(); i++){
            UserInfo userInfo = userInfoList.get(i);
            ContentValues contentValues = new ContentValues();
            contentValues.put("name",userInfo.getName());
            contentValues.put("age",userInfo.getAge());
            contentValues.put("gender",userInfo.getGender());
            contentValues.put("update_time",userInfo.getTime());
            result = sqLiteDatabase.insert(tableName,"",contentValues);
            if(result == -1){
                return result;
            }
        }
        return result;
    }
    //删除记录
    public int delete(String tableName,String condition){
        return sqLiteDatabase.delete(tableName,condition,null);
    }
    //删除全部记录
    public int deleteAll(String tableName){
        return sqLiteDatabase.delete(tableName,"_id>0",null);
    }
    //更新记录
    public int upDate(String tableName,UserInfo userInfo,String condition){
        ContentValues contentValues = new ContentValues();
        contentValues.put("name",userInfo.getName());
        contentValues.put("age",userInfo.getAge());
        contentValues.put("gender",userInfo.getGender());
        contentValues.put("update_time",userInfo.getTime());
        return sqLiteDatabase.update(tableName,contentValues,condition,null);
    }
}

        Activity中的Java代码。



public class DataBaseActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {

    private EditText editText_Name, editText_Age;
    private RadioGroup radioGroup_gender;
    private Button button_Write, button_Read, button_Add, button_Delete, button_DeleteAll, button_Update;
    private TextView textView;
    private String gender = "其他";
    private MySQLiteOpenHelper mySQLiteOpenHelper;
    private List<UserInfo> userInfoList = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data_base);

        editText_Name = findViewById(R.id.editText_Name);
        editText_Age = findViewById(R.id.editText_Age);
        radioGroup_gender = findViewById(R.id.radioGroup_gender);
        button_Write = findViewById(R.id.button_Write);
        button_Read = findViewById(R.id.button_Read);
        button_Add = findViewById(R.id.button_Add);
        button_Delete = findViewById(R.id.button_Delete);
        button_DeleteAll = findViewById(R.id.button_DeleteAll);
        button_Update = findViewById(R.id.button_Update);
        textView = findViewById(R.id.textView);

        button_Write.setOnClickListener(this);
        button_Read.setOnClickListener(this);
        button_Add.setOnClickListener(this);
        button_Delete.setOnClickListener(this);
        button_DeleteAll.setOnClickListener(this);
        button_Update.setOnClickListener(this);
        radioGroup_gender.setOnCheckedChangeListener(this);

        mySQLiteOpenHelper = MySQLiteOpenHelper.getInstance(this, 1, "HelperDataBase", "userInfo");
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.button_Add) {
            if (userInfoList == null) {
                userInfoList = new ArrayList<UserInfo>();
            }
            UserInfo userInfo = new UserInfo();
            Calendar calendar = Calendar.getInstance();
            String time = String.format("%s:%s:%s.%s", calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
            String Name = editText_Name.getText().toString();
            String Age = editText_Age.getText().toString();
            userInfo.setTime(time);
            userInfo.setName(Name);
            userInfo.setAge(Integer.parseInt(Age));
            userInfo.setGender(gender);
            boolean is = userInfoList.add(userInfo);
            Log.d(TAG, String.format("%s", is ? "成功" : "失败"));
        } else if (view.getId() == R.id.button_Write) {
            mySQLiteOpenHelper.openWriteLink();
            long result = mySQLiteOpenHelper.insert(userInfoList, "userInfo");
            if (result != -1) {
                textView.setText(textView.getText() + "添加成功!\n");
                userInfoList = null;
                mySQLiteOpenHelper.closeLink();
            } else {
                textView.setText(textView.getText() + "添加失败!\n");
                mySQLiteOpenHelper.closeLink();
            }
        } else if (view.getId() == R.id.button_Read) {
            mySQLiteOpenHelper.openReadLink();
            userInfoList = mySQLiteOpenHelper.query("userInfo", "_id>0");
            for (int i = 0; i < userInfoList.size(); i++) {
                UserInfo userInfo = userInfoList.get(i);
                String string = String.format("ID:%d\nName:%s\nAge:%d\ngender:%s\ntime:%s\n", userInfo.get_id(), userInfo.getName(), userInfo.getAge(), userInfo.getGender(), userInfo.getTime());
                textView.setText(textView.getText() + string);
            }
            mySQLiteOpenHelper.closeLink();
        } else if (view.getId() == R.id.button_Delete) {
            mySQLiteOpenHelper.openWriteLink();
            mySQLiteOpenHelper.delete("userInfo","age<18");
        } else if (view.getId() == R.id.button_DeleteAll) {
            mySQLiteOpenHelper.openWriteLink();
            mySQLiteOpenHelper.deleteAll("userInfo");
        } else {
            mySQLiteOpenHelper.openWriteLink();
            UserInfo userInfo = new UserInfo();
            userInfo.setName(editText_Name.getText().toString());
            userInfo.setAge(Integer.parseInt(editText_Age.getText().toString()));
            userInfo.setGender(gender);
            Calendar calendar = Calendar.getInstance();
            String time = String.format("%s:%s:%s.%s", calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
            userInfo.setTime(time);
            mySQLiteOpenHelper.upDate("userInfo",userInfo,"_id=1");
        }
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int id) {
        if (id == R.id.radio_male) {
            gender = "男";
        } else if (id == R.id.radio_female) {
            gender = "女";
        } else {
            gender = "其他";
        }
    }


}

        效果图如下,输入信息后依次点击添加按钮、提交按钮、读取按钮可以看到数据已经写入数据库中;再次输入信息后点击更新按钮,再点击读取按钮,可以看到数据库的第一项的年龄以及时间改变了;点击删除按钮再点击读取按钮,可以看到数据并没有发生改变,是因为要删除的条件是年龄小于18,因此没有变化;点击删除全部按钮再点击读取发现并没有读取到数据,说明数据库中的userInfo表是空的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值