Android SQL数据库的使用

sql server数据库移植到安卓sqlite使用 由于项目需求,要将原来的sql server数据库移植到安卓本地,于是尝试了一些办法将数据库进行导入导出。 1、导出为sql文件 简单看了看导出的sql文件,前面是: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO 意思是: SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字... 阅读详情

在android项目开发中,我们经常会用到数据的本地存储。比如SharedPreferences存储用户的一些基本
信息,或者通过文件存储从服务器请求的接口数据。正常来说,我们肯定会优先选择SharedPreferences
存储或文件存储。这2中存储方式更简单,而且数据的读取和存储的速度都相对于数据库较快。
最近正在使用融云的ImLib做聊天,为了让用户一打开应用就能看到会话列表,再加上数据结构相对复
杂,数据量大,于是我就使用了数据库来存储这些数据。

我们的界面实现效果基本上和QQ类似,这是从我的QQ列表的截图。
界面效果:
这里写图片描述

会话Item类 ConversationItem.java:

public class ConversationItem implements Serializable {
    //会话id
    private String targetId;
    //会话标题
    private String name;
    //会话内容
    private String content;
    //会话时间
    private String time;
    //是否置顶
    private int istop;

    public ConversationItem(String targetId, String name, String content, String time, int istop) {
        this.targetId = targetId;
        this.name = name;
        this.content = content;
        this.time = time;
        this.istop = istop;
    }

    public String getTargetId() {
        return targetId;
    }

    public void setTargetId(String targetId) {
        this.targetId = targetId;
    }

    public String getName() {
        return name;
    }

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

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getIstop() {
        return istop;
    }

    public void setIstop(int istop) {
        this.istop = istop;
    }

    public String getTime() {
        return time;
    }

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

Constant.java 定义需要用到的常量字段

public class Constant {
    public static final String DATABASE_NAME = "szy_im.db";
    public static final int DATABASE_VERSION = 1;
    public static final String TABLE_NAME = "conversion_list";

    //会话id
    public static final String CID = "cid";
    //用户id,当前用户的标识,用户可能会切换账号
    public static final String UID = "uid";
    //会话标题
    public static final String TITLE = "title";
    //会话内容
    public static final String CONTENT = "content";
    //消息时间
    public static final String TIME = "time";
    //会话是否置顶 0 否 1 是
    public static final String ISTOP = "istop";
}

数据库的创建和表的创建 DBHelper .java:

public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public DBHelper(Context context) {
        super(context, Constant.DATABASE_NAME, null, Constant.DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table " + Constant.TABLE_NAME + " ( " + Constant.CID +
                " text primary key," + Constant.UID + " text, " + Constant.TITLE + " text ,"
                + Constant.CONTENT + " text ," 
                + Constant.TIME + " text,"
                //默认会话不置顶
                + Constant.ISTOP + " Integer default '0' )";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

数据库数据操作,DBManger .java:

public class DBManger {
    private static DBHelper dbHelper;
    private static String uid;

    public static DBHelper getInstance(Context context) {
        if (dbHelper == null) {
            dbHelper = new DBHelper(context);
            SharedPreferences preferences = context.getSharedPreferences(Constant.SHARED_PREFERENCES, Context.MODE_PRIVATE);
            uid = preferences.getString(Constant.ID_USER, "");
        }
        return dbHelper;
    }

    //把cid存入表中
    public static long insert(DBHelper db, String cid) {
        long ret = -1;
        if (db != null && !StringUtils.isEmpty(cid)) {
            boolean exist = isExist(db, cid);
            if (!exist) {
                SQLiteDatabase database = db.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(Constant.TID, cid);
                values.put(Constant.UID, uid);
                ret = database.insert(Constant.TABLE_NAME, null, values);
                db.close();
            }else{
                SQLiteDatabase database = db.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(Constant.UID, uid);
                ret = database.insert(Constant.TABLE_NAME, null, values);
                db.close();
            }
        }
        return ret;
    }

    //设置会话标题
    public static long updateTitle(DBHelper db, String cid, String title) {
        long ret = -1;
        if (db != null && !StringUtils.isEmpty(title)) {
            ret = update(db, cid, title, null, null, -1);
        }
        return ret;
    }

    //设置会话内容
    public static long updateContent(DBHelper db, String cid, String content) {
        long ret = -1;
        if (db != null && !StringUtils.isEmpty(content)) {
            ret = update(db, cid, null, content, null, -1);
        }
        return ret;
    }

    //设置会话时间
    public static long updateTime(DBHelper db, String cid, String time) {
        long ret = -1;
        if (db != null && !StringUtils.isEmpty(time)) {
            ret = update(db, cid, null, null, time, -1);
        }
        return ret;
    }

    //设置会话置顶
    public static long updateIsTop(DBHelper db, String cid, int istop) {
        long ret = -1;
        if (db != null && istop >= 0) {
            ret = update(db, cid, null, null, null, istop);
        }
        return ret;
    }

    //设置会话
    public static long update(DBHelper db, String cid, String title, String content, String time, int istop) {
        long ret = -1;
        boolean isupdate = false;
        if (db == null || StringUtils.isEmpty(cid)) {
            return ret;
        }
        SQLiteDatabase database = db.getWritableDatabase();
        ContentValues values = new ContentValues();
        if (!StringUtils.isEmpty(title)) {
            values.put(Constant.TITLE, title);
            isupdate = true;
        }
        if (!StringUtils.isEmpty(content)) {
            values.put(Constant.CONTENT, content);
            isupdate = true;
        }
        if (!StringUtils.isEmpty(time)) {
            values.put(Constant.TIME, time);
            isupdate = true;
        }
        if (istop >= 0) {
            values.put(Constant.ISTOP, istop);
            isupdate = true;
        }
        if (isupdate) {
            ret = database.update(Constant.TABLE_NAME, values, Constant.CID + "= ?", new String[]{cid});
            database.close();
        }
        return ret;
    }

    //删除表中所有数据
    public static long deleteAll(DBHelper db) {
        long ret = -1;
        if (db != null) {
            SQLiteDatabase database = db.getWritableDatabase();
            database.delete(Constant.TABLE_NAME, null, null);
            database.close();
        }
        return ret;
    }

    //根据会话ID删除数据
    public static long deleteItem(DBHelper db, String cid) {
        long ret = -1;
        if (db != null) {
            SQLiteDatabase database = db.getWritableDatabase();
            ret = database.delete(Constant.TABLE_NAME, Constant.CID + " = ?", new String[]{cid});
            database.close();
        }
        return ret;
    }

    //根据uid查询表中的所有数据,并根据时间和是否置顶进行降序排列
    public static List<ConversationItem> selectAll(DBHelper db) {
        List<ConversationItem> list = new ArrayList<>();
        if (db == null) {
            return list;
        }
        SQLiteDatabase database = db.getReadableDatabase();
        String sql = "select * from " + Constant.TABLE_NAME + " where " + Constant.UID + "= ? order by " 
        + Constant.TIME + " DESC," + Constant.ISTOP + " DESC";
        Cursor cursor = database.rawQuery(sql, new String[]{uid});
        if (cursor.moveToFirst()) {
            do {
                String cid = cursor.getString(cursor.getColumnIndex(Constant.CID));
                String title = cursor.getString(cursor.getColumnIndex(Constant.TITLE));
                String content = cursor.getString(cursor.getColumnIndex(Constant.CONTENT));
                String time = cursor.getString(cursor.getColumnIndex(Constant.TIME));
                int istop = cursor.getInt(cursor.getColumnIndex(Constant.ISTOP));
                ConversationItem item = new ConversationItem(tid, title, content, time, istop);
                list.add(item);
            } while (cursor.moveToNext());
        }
        cursor.close();
        database.close();
        return list;
    }

    //查询cid是否存在
    public static boolean isExist(DBHelper db, String cid) {
        boolean ret = true;
        if (db == null) {
            return ret;
        }
        SQLiteDatabase database = db.getReadableDatabase();
        String sql = "select * from " + Constant.TABLE_NAME + " where " + Constant.TID + " = ?";
        Cursor cursor = database.rawQuery(sql, new String[]{cid});
        if (cursor.getCount() < 1) {
            ret = false;
        }
        return ret;
    }
}

目前数据库没有什么太大的问题,但还是有一个小问题,我把会话id设置为主键,当切换账号的时候,若
新账号也有相同的会话,则新账号在本地数据库取不到该会话数据,暂时还没想到怎么解决。
界面显示的时候是先从本地数据库中去会话数据,然后开启一个线程去取融云存储的聊天会话,虽然我的
数据库存储有点问题,但还是可以正确显示的。
还有一个问题需要大家注意,就是数据库的数据的维护,最好是接收消息然后存到数据库,这样的话,可
以有效的减少对数据库的操作,从而也提高了效率。可能我比较笨吧,后来才想到这样做,哈哈!
我是一个小菜鸟,不足之处请大神们进行批评和指正。

Android读取sql文件并导入数据库 sql文件一般不应该由Android直接执行的,正常应该是先转成db文件直接放入Android中,Android只需执行一些简单sql命令。 但有时有这样的需求怎么办呢,比如你数据库是上个版本放进的,这个版本的更新就是一个sql文件,你重新放一个数据库那用户数据都没了。 这个还是很简单的,从assets读取到sql文件,转成String,获取writeableDatabase,然后执行sql就 阅读详情

相关推荐

安卓使用 jtds 连接SQL server2012数据库

1.jtds简介jTDS是一个开放源代码的100%纯Java实现的JDBC3.0驱动,用于连接 Microsoft SQL Server和Sybase,基于freeTDS的,并且是目前最快的可企业级应用的SQL Server和Sybase的JDBC驱动程序,由Microsoft专门为Java打造的连接SQL server的插件。优点:完全兼容SQL server2012及之前的版本。专门为SQL ...

njnutzhou的博客 1778

Android之SQLite数据库使用

SQLite是Android系统集成的一个轻量级的数据库。Android提供了SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来可通过SQLiteDatabase对象来管理、操作数据库了。

qq_38056514的博客 7380

Android Studio 使用插件Database Navigation 连接 sqlite数据库

Database Navigation 是一款在 Android Studio 开发环境中非常实用的插件,它主要致力于帮助开发者更便捷、高效地管理和操作数据库,尤其是在 Android 项目涉及到数据库相关开发工作时,能够提升开发体验与效率。

梁辰兴的博客 2556

Android 使用SQLite数据库

Android 往SQLite数据库中存放类,更简单的使用数据库存储功能

qq_38174131的博客 6525

Android中使用SQL语句进行数据库的CRUD操作

Android提供了SQLite数据库作为默认的本地数据库解决方案,可以使用SQL语句执行各种CRUD(创建、读取、更新和删除)操作。通过上述步骤,您可以在Android应用程序中使用SQL语句执行数据库的CRUD操作。这种方式对于简单的数据库操作非常方便和灵活,但对于复杂的数据库操作,可能需要考虑使用ORM(对象关系映射)框架,如Room库,来简化开发过程。需要注意的是,上述示例中的SQL语句仅为演示目的,实际应用中应根据具体需求进行修改。表中的所有记录,并遍历每条记录,获取每条记录的id和name。

ByteWhisper的博客 285

安卓db数据库查看工具——快速管理与分析SQLite数据库

SQLite 是 Android 内置的轻量级关系型数据库管理系统,为 Android 应用提供了一种高效、便捷的数据持久化方案。与传统的关系型数据库不同,SQLite 将数据库存储在文件系统中的单一文件内,从而简化了数据库的部署和管理。SQLite 支持标准的 SQL 语言,允许在没有服务器进程的情况下进行数据库操作,这使得它非常适合于资源有限的移动设备环境。在 Android 应用开发中,SQLite 数据库常用于本地数据存储、用户个性化设置记录以及应用内缓存。

weixin_32869687的博客 1941

Sqlite 数据库使用方法

import android.annotation.SuppressLint; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import andr...

Jsonuu的博客 1268

逆向攻防世界CTF系列40-ReverseMe-120

注意sub_401000main中只传了两个参数,但是跟进后发现四个(可能是隐式传递,放在寄存器里传递了),调试发现a4是输入长度,与最终的you_know_how_to_remove_junk_code比较的是v12(但是并没有被传入),开始怀疑是不是隐式传递了。_mm_xor_si128用于计算128位(16字节)的按位异或,然后通过v14控制循环结束的条件,可以看到v14增长的步长为16,而且通过上面得到的flag值解码得到的字符串为32个字节大小,正好是16的整数倍。

LH1013886337的博客 1410

Android SQLite使用详解

Android关于SQLite数据库的使用详解

jpfice的博客 1751

ADS仿真设计平行定向耦合器学习笔记

ADS仿真设计平行定向耦合器

qq_36521926的博客 1万+

Ubuntu+Dify实战:如何让大模型知识库完美支持图片召回(附避坑指南)

本文详细介绍了在Ubuntu系统上部署Dify平台,并实现大模型知识库图片召回功能的完整实战方案。通过解析Dify处理图片的底层逻辑,重点讲解了配置Nginx代理服务器将本地图片路径转换为可公开访问URL的核心工程步骤,并提供了文档预处理、环境变量配置以及父子分段策略等高级技巧,帮助开发者构建图文并茂的AI应用,有效提升知识库的丰富性和用户体验。

c7d8e的博客 445

查看安卓sqlite数据库工具:Android-Debug-Database

简要介绍 安卓开发过程中,有时需要查看sqlite数据库,核对数据.本文介绍Android-Debug-Database,非常好用. github地址:https://github.com/amitshekhariitbhu/Android-Debug-Database 功能: 支持查看手机该app的数据库和shared preference. 支持修改数据库和shared preferenc...

蓝不蓝编程 1523

ADS 使用调整器动态调参教程(Tuning)

ADS动态调参教程

weixin_42845306的博客 1万+

Android 将.sql格式文件转换为.db格式数据库文件

有些时候,我们的android应用程序需要用到外部的数据库文件。我们也清楚,适合于android平台使用的或许是.db格式的数据库文件了。下面说下如何将.sql格式的数据库文件利用Navicat Lite得到.db格式文件。步骤如下: 下载安装Navicat Lite 打开Navicat Lite, 连接到本地MySQL(因为MySQL可以打开.sql格式的数据库文件) 连接到新的.db数据库(可以

AlanBoon希望能够帮助到你! 7956

MediaCodec视频解码流程详解及参考demo

本文主要讲解mediacodec的视频解码流程,及demo参考例子。

分享音视频技术 7874

【全网首发】2026华为OD双机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

算法大师! 8782

安卓增删改查用sql语句号码_Android SQL语句实现数据库的增删改查

packagecom.wuyudong.db.dao;importjava.util.ArrayList;importjava.util.List;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importcom.wuyudong.db...

weixin_42525551的博客 107

XGBoost原生接口和Sklearn接口参数详解

XGBoost原生接口和Sklearn接口参数详解

算法工程师 2654

android 代码操作.db demo,SQL语句操作SQLite数据库Demo

布局文件如下:xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.sqlite.MainActivity"android:orientation="vertical...

weixin_34028581的博客 198

使用 MATLAB/Simulink 构建一个基于FOC控制的PMSM矢量控制仿真模型

本教程详细介绍了基于MATLAB/Simulink的永磁同步电机(PMSM)磁场定向控制(FOC)系统建模与仿真方法。主要内容包括:PMSM电机模型参数设置、Clarke/Park变换模块设计、电流环PID控制器配置、SVPWM调制实现以及系统仿真参数优化。文章提供了模块化设计思路和具体参数设置示例,并给出了PID整定建议和进阶优化方向。通过该仿真模型,可深入理解PMSM矢量控制原理,掌握高性能电机控制系统的建模技巧,适用于伺服系统、电动汽车驱动等高端控制场景。教程还推荐了实时仿真和高级控制策略等扩展应用。

xiaoheshang_123的博客 529

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

在Android studio中使用room库操作数据库表写操作接口报错SQL error or missing database (no such table: user)

摘要:在Android Studio中使用Room库时,出现"no such table: user"错误,原因是未将User实体类加入@Database(entities = {})注解中。解决方法是在数据库类的注解中添加User.class,如@Database(entities = {Person.class, User.class}),确保Room能正确扫描到该表。修改后错误消失,查询接口正常工作。关键点在于所有Room实体类都必须在@Database注解中明确声明。

二木成林 439

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 如何打开s3db,Android开发教程:使用已有的SQL数据库

极品好儿媳全文阅读,燃料乙醇放量,嘉兴办公家具,应向阳,58会展网,证书挂靠,鱼缸清洗,qq蜡笔小新头像我在sqliteadmin 创建好数据库StuDB,里面的表如下:650) this.width=650;">将创建好的数据库在DDMS中点击650) this.width=650;">导入到data/data/程序的包名/650) this.width=650;">SQLit...

weixin_34759490的博客 406

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Studio 查看db文件

FILE-settings-plugins-marketplace-搜索simplesqlitebrowser安装。FILE-settings-plugins-marketplace-搜索Database Navigator。1.最简单的方式直接下载simplesqlitebrowser插件,在as中点击db文件,即可打开。安装重启as后左侧多了DB Browser,点击添加DB文件。select * from table名。点击运行,即会生成数据库表。

geniushorse的博客 7869

安卓开发查询mysql数据_【转】Android开发之数据库SQL

android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作。一、android内的数据库的基础知识介绍1.用了什么数据库android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c语言构建的。相关简介可以从链接查看。2.数据库基本知识观花对于一些和我一样还没有真正系统学习数据库技术的同学来说,把SQL92标准中的一些基本概念、基本语句快速的了...

weixin_30909805的博客 724

Android SQL语句实现数据库的增删改查

android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delete from person where name = 'wuyudong' * 改 update person set number='119' where

zh1247的博客 512
上一篇: xml常用样式实现
下一篇: FileUtils文件存储,实现文字和图片的本地存储
szy_
博客等级 码龄10年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值