SQLite 使用方法详解 Android 数据存储(二)

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

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

微信公众号:ProgramAndroid

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

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

1. 继承SQLiteOpenHelper 创建数据库,数据表
2. 插入数据库数据
3. 删除数据库数据
4. 查询数据库数据
5. 修改数据库数据
6. 数据库使用Demo

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

  • 实现效果

0?wx_fmt=jpeg

数据库增删改查

  • 创建数据库

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

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

0?wx_fmt=gif

点击阅读原文,获取更多福利

0?wx_fmt=gif

AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
内容概要:本文介绍了基于物PINN驱动的三维声波波动方程求解(Matlab代码实现)理信息神经网络(PINN)求解三维声波波动方程的Matlab代码实现方法,展示了如何利用PINN技术在无需大量标注数据的情况下,结合物理定律约束进行偏微分方程的数值求解。该方法将神经网络与物理方程深度融合,适用于复杂波动问题的建模与仿真,并提供了完整的Matlab实现方案,便于科研人员理解和复现。此外,文档还列举了多个相关科研方向和技术服务内容,涵盖智能优化算法、机器学习、信号处理、电力系统等多个领域,突出其在科研仿真中的广泛应用价值。; 适合人群:具备一定数学建模基础和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事计算物理、声学仿真、偏微分方程数值解等相关领域的研究人员; 使用场景及目标:①学习并掌握PINN在求解三维声波波动方程中的应用原理与实现方式;②拓展至其他物理系统的建模与仿真,如电磁场、热传导、流体力学等问题;③为科研项目提供可复用的代码框架和技术支持参考; 阅读建议:建议读者结合文中提供的网盘资源下载完整代码,按照目录顺序逐步学习,重点关注PINN网络结构设计、损失函数构建及物理边界条件的嵌入方法,同时可借鉴其他案例提升综合仿真能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值