Android中数据库的一些操作(增删改查)

2023-05-16

提起Android的开发,就不得不提数据库,几乎每个App中都会用到Sqlit数据库存储一些数据,小编闲暇时期,写了一个小demo关于数据库的增删改查,之前也介绍过数据库的一个开源框架ORMLite,在这里主要用到的是Android自带的一些空间和属性来实现的,话不多少,直接上代码吧:

1、数据库的创建:


private static final String TABLENAME = "student";
private static final String CREATETABLE = "CREATE TABLE " + TABLENAME +
        "(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)";
public void creatTable(View view){
    /**
     * 创建数据库
     * 参数一:数据库名
     * 参数二:模式,一般为MOE_PRIVATE
     * 参数三:游标工厂对象,一般写null,表示系统自动提供
     */
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    db.execSQL(CREATETABLE);
    db.close();
}
2、数据库表的创建和数据的添加:

public void insertData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    ContentValues values = new ContentValues();
    values.put("name","张三");
    values.put("age",18);
    /**
     *插入数据
     * 参数一:要插入的表名
     * 参数二:要插入的空数据所在的行数,第三个参数部位空,则此参数为null
     * 参数三:要插入的数据
     */
    db.insert(TABLENAME,null,values);
    ContentValues values1 = new ContentValues();
    values1.put("name","李四");
    values1.put("age",21);
    db.insert(TABLENAME,null,values1);
    db.close();
}
数据添加后的数据库结构:


3、数据库的更新:


public void updateData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    ContentValues values = new ContentValues();
    values.put("name","赵四");
    values.put("age",43);
    /**
     * 数据的更新
     * 参数一:要更新的数据所在的表名
     * 参数二:新的数据
     * 参数三:要更新数据的查找条件
     * 参数四:条件的参数
     */
    db.update(TABLENAME,values,"_id=?",new String []{"2"});
    db.close();
}
数据更新后:


4、数据的查找:


public void queryData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    //查询部分数据
    Cursor cursor = db.rawQuery("select * from " + TABLENAME + "where name=?",new String []{"张三"});
    //查询全部数据
    Cursor cursor1 = db.rawQuery("select * from " + TABLENAME ,null);
    //将游标移到第一行
    cursor1.moveToFirst();
    //循环读取数据
    while(!cursor1.isAfterLast()){
        //获得当前行的标签
        int nameIndex = cursor1.getColumnIndex("name");
        //获得对应的数据
        String name = cursor1.getString(nameIndex);
        int ageIndex = cursor1.getColumnIndex("age");
        int age = cursor1.getInt(ageIndex);
        Log.d(TAG, "name:"+ name +"age: "+age);
        //游标移到下一行
        cursor1.moveToNext();
    }
    db.close();
}
查询的结果:


5、数据的删除:


public void delectData(View view){
    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
    //要删除的数据
    db.delete(TABLENAME,"name = ?",new String[]{"赵四"});
    db.close();
}
数据删除后:

SqliteOpenHelper的用法:
该类的方法:
1、getReadableDatabase() 创建或者打开一个可读写的数据库,如果出现问题(磁盘满等),则打开一个只读的数据库。

2、getWritableDatabase() 获得一个可读写的数据库。如果磁盘满则会抛异常。

3、onCreate(SQLiteDatabase db) 只有第一次创建这个数据库的时候调用。一般在这个方法中创建数据的相应表。

4、onOpen(SQLiteDatabase db) 当每次打开数据库的时候都会调用。这个方法很少使用

5、onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 当升级数据库即数据库的版本号发生改变的时候调用,一般如果需要修改表结构就写在这里.

//db.execSQL(“alert 表名 add 列名列数据类型”);

6、close()   关闭打开的所有数据库对象

使用步骤:
创建SQLiteOpenHelper类的子类MySQLiteOpenHelper 类,实现SQLiteOpenHelper类中的抽象方法onCreate()和onUpgrade();
调用 MySQLiteOpenHelper 对象的getWritableDatabase 或 getReadableDatabase方法,获得SQLiteDatabase 对象;
创建表。
调用SQLiteDatabase 对象的execSQL()方法,执行 update,insert,delete操作;调用rawQuery()方法执行select查询操作;
如果执行的是查询操作,则对返回的Cursor进一步处理。
示列:
布局:
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
    <ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/button"/>
    <Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"
android:onClick="btnClick"/>

</RelativeLayout>
菜单Menu:
 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
android:id="@+id/insert_item"
app:showAsAction="never"
android:title="插入数据"/>

    <item
android:id="@+id/delete_item"
app:showAsAction="never"
android:title="删除数据"/>
    <item
android:id="@+id/update_item"
app:showAsAction="never"
android:title="修改数据"/>
</menu>
Student实例:
 public class StudentEntity {

private String name;
    private Integer age;

    public StudentEntity() {
    }

public StudentEntity(String name, Integer age) {
this.name = name;
        this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

@Override
public String toString() {
return "StudentEntity{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
SQLiteOpenHelper类的子类:
 public class MyOpenHlper extends SQLiteOpenHelper{

private static final String TABALENAME = "student";
    private static final String CREATETABLE = "CREATE TABLE " + TABALENAME
+ "(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, age INTEGER)";
//构造方法,系统会自动创建数据库文件
public MyOpenHlper(Context context,String name,int version){
super(context,name,null,version);
}
//只有在第一次打开数据库的时候调用
@Override
public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATETABLE);
}


//当数据库的版本发生变化的时候调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//更新表结构或删除旧的表结构
db.execSQL("DROP TABLE IF EXISTS "+TABALENAME);
onCreate(db);
}
}
主函数:
 public class MySqlite extends MainActivity{

private static final String TABALENAME = "student";
    private ListView mListView;
    private List<StudentEntity> mList;
    private MyOpenHlper myOpenHlper;
    private SQLiteDatabase db;
    private Cursor mCursor;
    private SimpleCursorAdapter adapter;
    private int index = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mysqlite);
init();
downLoadData();
}

public void init(){
mListView = (ListView) findViewById(R.id.listView);
mList = new ArrayList<>();
myOpenHlper = new MyOpenHlper(this,"test.db",2);
db = myOpenHlper.getWritableDatabase();
mCursor = db.rawQuery("select * from "+TABALENAME,null);
adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, mCursor,
                new String[]{"name","age"},
                new int[]{android.R.id.text1,android.R.id.text2},
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
mListView.setAdapter(adapter);
}
public void downLoadData(){
mList.add(new StudentEntity("张三",12));
mList.add(new StudentEntity("李四",15));
mList.add(new StudentEntity("王五",18));
mList.add(new StudentEntity("赵六",22));
mList.add(new StudentEntity("麻子", 25));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
        if(id == R.id.insert_item){
if(index<mList.size()){
                ContentValues values = new ContentValues();
values.put("name",mList.get(index).getName());
values.put("age",mList.get(index).getAge());
db.insert(TABALENAME,null,values);
mCursor = db.rawQuery("select * from "+TABALENAME,null);
adapter.swapCursor(mCursor);
index++;
}
        }
return true;
}

/*  public void btnClick(View view){

        if(index<mList.size()){
            ContentValues values = new ContentValues();
            values.put("name",mList.get(index).getName());
            values.put("age",mList.get(index).getAge());
            db.insert(TABALENAME,null,values);
            mCursor = db.rawQuery("select * from "+TABALENAME,null);
            adapter.swapCursor(mCursor);
            index++;
        }
    }*/
}
其中:SimpleCursorAdapter是CursorAdapter的子类,
使用方式与SimpleAdapter类似
原型:

new SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to , int flags) ;

参数:

1)、Context context, 这个与 SimpleListItemFactory 相关的 ListView 所处运行上下文(context)。也就是这个 ListView 所在的 Activity。

 

2)、int layout, 显示 list item 的 布局文件。这个 layout 文件中至少要包含在 "to" 参数中命名的 views。

 

3)、Cursor c, 数据库的光标( Cursor )。如果 cursor 无效,则该参数可以为 null

 

4)、String[] from, 指定 column 中的哪些列的数据将绑定(显示)到 UI 中。如果 cursor 无效, 则该参数可为 null。

 

5)、int[] to, 指定用于显示 "from" 参数指定的数据列表的 views。 这些 views 必须都是 TextViews。 "from" 参数的前 N 个值(valus)和 "to" 参数的前 N 个 views 是一一对应的关系。如果 cursor 无效,则该参数可为 null。

 

6)、flags,用于定义适配器行为的标志位。

Flags used to determine the behavior of the adapter; may be any combination of FLAG_AUTO_REQUERY and FLAG_REGISTER_CONTENT_OBSERVER。

 

 FLAG_AUTO_REQUERY(常量值:1 )从 API11 开始已经废弃。因为他会在应用程序的 UI 线程中执行Cursor查询操作, 导致响应缓慢甚至应用程序停止响应(ANR)application not response的错误。作为替代方案,请使用 LoaderManager 和 CursorLoader. 

如果设置FLAG_REGISTER_CONTENT_OBSERVER(常量值:2),适配器会在Cursor上注册一个Observer,当通知到达时会调用 onContentChanged() 方法。

效果图:


原文:https://blog.csdn.net/w_l_s/article/details/62232768 
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中数据库的一些操作(增删改查) 的相关文章

  • Android 动态绘制曲线等各种图形

    Android 中动态的绘制有两种方法 xff0c 一种是用OpenGL ES xff0c 它主要用来做3D图形开发 xff0c 对于一般的应用 xff0c 我们会采取自定义一个View xff0c 然后覆盖onDraw 的方法 xff0c
  • Android 曲线图绘制

    最近项目里要做一个简单的曲线图来标识数据 xff0c 开始以为很简单 xff0c android已经有那么多的开源图表库了 xff0c 什么achartenginee hellochart xff0c mpandroidchart等等 xf
  • android中在代码中动态布按钮和画板局并绘制曲线

    strong 绘图面板基类继承View strong package com mytest myapplication Utility import android graphics Color import android util Lo
  • html5 div布局与table布局

    div布局 xff1a html 43 css实现简单布局 container中height不能写成百分数 xff0c 必须为具体高度 lt DOCTYPE html gt lt html gt lt head lang 61 34 en
  • andorid程序UI线程下开启子线程闪退错误解决

    android view ViewRootImpl CalledFromWrongThreadException Only the original 运行时报 android view ViewRootImpl CalledFromWron
  • Android子线程更新UI的方法总结

    消息机制 xff0c 对于Android开发者来说 xff0c 应该是非常熟悉 对于处理有着大量交互的场景 xff0c 采用消息机制 xff0c 是再好不过了 有些特殊的场景 xff0c 比如我们都知道 xff0c 在Android开发中
  • android中多线程绘制曲线图实例

    画板基类继承view package com mytest myapplication Utility import android graphics Color import android util Log import android
  • InterlockedCompareExchangePointer 的作用和例子

    PVOID InterlockedCompareExchangePointer in out PVOID volatile Destination in PVOID Exchange in PVOID Comperand Interlock
  • java读取xml文件的四种方法

    Xml代码 1 lt xml version 61 34 1 0 34 encoding 61 34 GB2312 34 gt 2 lt RESULT gt 3 lt VALUE gt 4 lt NO gt A1234 lt NO gt 5
  • Android多线程之同步锁的使用

    本文主要介绍了Android多线程之同步锁的使用 xff0c 分享给大家 xff0c 具体如下 xff1a 一 同步机制关键字synchronized 对于Java来说 xff0c 最常用的同步机制就是synchronized关键字 xff
  • C#使用 System.Net.Mail发送邮件功能

    C 使用 System Net Mail发送邮件功能 NET 里包含了很多很丰富的邮件发送与接受的API在 System Net Mail命名空间里 xff0c 使得我们开发发送和接受邮件相关功能变得简单 xff0c 下面是一个简单发送邮件
  • C#SMTP发邮件

    简单邮件传输协议 Simple Mail Transfer Protocol SMTP 是事实上的在Internet传输email的标准 C 邮件传输主要用到了 SmtpClient 和MailMessage 类 SmtpClient类是客
  • C#发送邮件实例

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • closehandle()函数

    引用自 百度百科 xff0c 用于解决今天遇到的close handle 后什么时候释放资源问题 xff1a 方法名称 xff1a CloseHandle 位置 xff1a Kernel32 dll BOOL CloseHandle HAN
  • c++清空串口缓冲区

    缓冲区控制 Win32通信API除了提供SetupComm 函数实现初始化的缓冲区控制外 xff0c 还提供了PurgeComm 函数和FlushFileBuffers 函数来进行缓冲区操作 PurgeComm 函数的声明如下 xff1a
  • C++ int与string的转化

    int本身也要用一串字符表示 xff0c 前后没有双引号 xff0c 告诉编译器把它当作一个数解释 缺省情况下 xff0c 是当成10进制 xff08 dec xff09 来解释 xff0c 如果想用8进制 xff0c 16进制 xff0c
  • c++中字符数组内存和指针问题示例解答

    char id 61 34 123456 34 char c 61 34 SN 61 34 unsigned char buffer 20 int j 61 0 for int i 61 0 i lt strlen c i 43 43 bu
  • c++中LPCTSTR,LPTSTR 解释

    char是C语言标准数据类型 xff0c 字符型 xff0c 至于由几个字节组成通常由编译器决定 xff0c 一般一个字节 Windows为了消除各编译器的差别 xff0c 重新定义了一些数据类型 xff0c 你提到了另外几个类型都是这样
  • Delphi 自定义事件的例子

    我们这个控件将演示控件的自定义事件的书写 这个控件有一个类型为string的SensitiveText属性 xff0c 当用户在输入框中输入的文字为InvalidText时就会触发OnSensitiveText事件 按照惯例 xff0c 我
  • c++中sscanf的用法

    sscanf 读取格式化的字符串中的数据 swscanf 是 sscanf 的宽字符版本 xff1b swscanf 的参数是宽字符串 swscanf不处理 Unicode 全角十六进制或 34 兼容性区 34 字符 除此以外 xff0c

随机推荐

  • c++内存测试

    void MemoryTest 内存测试 指针嵌套 char rr 栈中分配内存 系统自动分配释放 xff09 int ee 61 int amp rr 将rr的内存地址转换成整型数 char yy 61 amp rr 定义一个字符型指针y
  • C/C++串口通信原理及读写与操作

    http wangbaiyuan cn c serial communication write reading html 展开 文章目录 在工业控制中 xff0c 工控机 xff08 一般都基于Windows平台 xff09 经常需要与智
  • c# 调用c库dll ,char*转string的解决办法

    最近由于有个未知的设备需要用到modbus通讯协议 xff0c 底层需要与PLC通讯 xff0c 坤跌 xff0c PLC啥型号也不清楚封在里面不能拆 前人只留了几个不能运行的QT代码以及不完整的文档 用惯了C 想要重新学QT xff0c
  • C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位 xff0c 我们在实际开发时或者找工作面试时总能遇到多线程的问题 xff0c 对多线程的理解程度从一个侧面反映了程序员的编程水平 其实C 43 43 语言本身并没有提供多线程机制 xff08 当然目前C 43
  • Android Studio 使用Log

    Android使用log来记录信息 xff0c 测试了下 xff0c 和system out println区别不大 xff0c 主要优势在于能使用过滤器过滤日志 本文记录基础的log使用方法 xff0c 来自 第一行代码 xff0c 以及
  • 指针强制转换问题

    void ff void abc 任意类型数据指针 xff08 指针即内存地址 xff09 int z 61 int abc 强制转换成int 指针变量 int zz 61 z 获取内存中的值
  • 新手git教程

    本文转载自 xff1a http igeekbar com igeekbar post 82 htm Git近些年的火爆程度非同一般 xff0c 这个版本控制系统被广泛地用在大型开源项目 xff08 比如Linux xff09 xff0c
  • 使用Project进行项目管理

    下面开始介绍Project的使用 1 从下列地址获取Project 2010的副本 版权问题 xff0c 已删除地址 2 安装 2 1 版权页 2 2 自定义安装页 2 3 安装完毕 3 使用该软件进行项目管理 3 1 打开Project
  • Marshal在C#中的应用(void *指针到IntPtr的转化)

    C 调用C语言的API时一般把void 指针转换成IntPtr xff0c 但这经常远远不够的 在C语言中void 是个万金油 xff0c 尤其是一些老的c语言程序 xff0c 所有的参数就一个void 指针 xff0c 里面包罗万象 xf
  • VS2012 2013 无法显示查找功能 无法具体定位 解决方法

    xfeff xfeff 问题的现象 通过使用 Ctrl 43 Shift 43 F 也就是Find In Files功能 xff0c 使用之后只能显示统计结果 不显示具体行 如下图 regedit 中在注册表中查找 xff1a HKEY C
  • C#中使用指针转换数据类型[C#/unsafe]

    今日因为一个同事说起 xff0c 在原来的旧系统中使用指针做数据转换很方便 xff0c 比如要把浮点数转化为数组 xff0c 也或者是字符串的相互转换 xff1b 当然 xff0c 大家都知道c 中实现指针只需要写入unsafe 编译选项把
  • c#指针的使用例程

    unsafe double value 61 888888 byte v1 61 BitConverter GetBytes value byte v2 61 new byte v1 Length double pv 61 amp valu
  • MPAndroidChart LineChart 折线图 你要的都在这里了

    前言 MPAndroidChart已经出了很长的一段时间 xff0c 相信大家也有所耳闻 xff0c 自己也使用了有一段时间 xff0c 固在此写下文章 xff0c 根据项目的需求 xff0c 记录一些见解与问题 xff0c 作为参考 望大
  • Android Chart框架 MPAndroidChart 坐标轴设置

    1 轴线的绘制 设置轴线就先必须取得轴线类Axis 在一个图标中有三个轴线 xff1a x轴 xff1a 调用 getXAxis 获取左边y轴 xff1a 调用 getAxisLeft 获取右边y轴 xff1a 调用 getAxisRigh
  • Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1 数据准备 1 1 数据来源 2 曲线展示 2 1 MPAndroidChart获取 2 2 数据对象获取 2 3 数据展示 3 曲线完善 3 1 图表背景 边框 网格线修改 3 2 X Y轴值的自
  • Android资源文件在配置文件中的使用

    Android资源文件大致可以分为两种 xff1a 第一种是res目录下存放的可编译的资源文件 xff1a 这种资源文件系统会在R Java里面自动生成该资源文件的ID xff0c 所以访问这种资源文件比较简单 xff0c 通过R XXX
  • android 如何创建配置文件和读配置文件

    因为一些配置信息 xff0c 多处用到的 且以后可能变更的 xff0c 我想写个 prorperties配置文件给管理起来 在studio中新建一个Assets文件 gt 新建一个file文件类型为properties文件 该文件可以与re
  • android上如何写配置文件

    android上如何写配置文件 xff1a 使用SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类 xff0c 用来保存应用的一些常用配置 xff0c 比如Activity状态 x
  • android SharedPreferences的用法

    之前做应用时碰到这样一个问题 xff1a 在 A Activity 要与 B Activity的Fragment进行通信传值 xff0c 但是忽然发现无法拿到B中Fragment的Handler xff0c 又不能发送广播 xff0c 短暂
  • Android中数据库的一些操作(增删改查)

    提起Android的开发 xff0c 就不得不提数据库 xff0c 几乎每个App中都会用到Sqlit数据库存储一些数据 xff0c 小编闲暇时期 xff0c 写了一个小demo关于数据库的增删改查 xff0c 之前也介绍过数据库的一个开源