SQLlite在安卓中的基本详解和简单使用

2023-05-16

一、基础介绍

1.SQLite 是一个进程内的库,是一种轻量级的、自给自足的、无服务器的、无需配置的,事务性的SQL数据库引擎.和他其他的数据库一样,SQLite引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite可以直接访问其存储文件。

SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,用C语言编写的开源嵌入式数据库引擎,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。

SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。

2.SQLite 是一个开源的嵌入式关系数据库。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。

3、SQLite的特点(SQLite’s Features and Philosophy) 
3.1、零配置(Zero Configuration) 
3.2、可移植(Portability): 
它是运行在Windows,Linux,BSD,Mac OS X和一些商用Unix系统,比如Sun的Solaris,IBM的AIX,同样,它也可以工作在许多嵌入式操作系统下,比如QNX,VxWorks,Palm OS, Symbin和Windows CE。 
3.3、Compactness: 
SQLite是被设计成轻量级,自包含的。one header file, one library, and you’re relational, no external database server required 
3.4、简单(Simplicity)、灵活(Flexibility)、可靠(Reliability): 
SQLite的核心大约有3万行标准C代码,这些代码都是模块化的,很容易阅读。 
SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。SQLite的整体结构图如下: 
               

值得一提的是,袖珍型的SQLite竟然可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。 
在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。

4.数据类型 
SQLite为弱类型数据。 
SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。因为定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。  
概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。 
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:

NULL: 这个值为空值 
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。 
CHAR(n):长度固定为n的字串,n不能超过 254。 
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8. 
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号. 
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE). 
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改  变格式。 
DATA :包含了 年份、月份、日期。 
TIME: 包含了 小时、分钟、秒。

二、数据库使用

SQLiteOpenHelper数据库版本管理 
为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是

onCreate(SQLiteDatabase db)

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),123

前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。

当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在 
onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。 
  getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。 
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

 

public class DatabaseHelper extends SQLiteOpenHelper {  

        //类没有实例化,是不能用作父类构造器的参数,必须声明为静态  

         private static final String name = "count"; //数据库名称  

         private static final int version = 1; //数据库版本  更新之后改变数据库版本号
         public DatabaseHelper(Context context) {  
              //第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类  
                super(context, name, null, version);  
         }    
        @Override  
        public void onCreate(SQLiteDatabase db) {  
              db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age 

INTEGER)");       
         }   
        @Override   
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
                 db.execSQL("ALTER TABLE person ADD phone VARCHAR(12)"); //往表中增加一列    
         }  123456789101112131415161718192021

将会对比版本号,如果本身没有数据库,即数据库版本号为0,也就是第一次安装app,就会直接走onCreate方法,如果数据库本身已经存在了,如果版本号大于改版本号,就会执行onUpgrade方法。数据库版本只能升级,不能降级,降级会闪退。

三、基本语句:

openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory  factory) 
打开或创建数据库 
insert(String table,String nullColumnHack,ContentValues  values) 
插入一条记录 
delete(String table,String whereClause,String[]  whereArgs) 
删除一条记录 
query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String  orderBy) 
查询一条记录 
update(String table,ContentValues values,String whereClause,String[]  whereArgs) 
修改记录 
execSQL(String sql) 
执行一条SQL语句 
close() 
关闭数据库

1、建表语句:

 

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20),age integer default(0); 1

主键自增,最高20位,default默认值。

2、插入

 

insert into person(name, age) values(‘小明’,3)  1

3、删除

 

delete from person  where age=10;1

4、更新

 

update person set name=‘小明‘ where age=10  1

5、查询

 

select * from person       查询所有
select * from person order by id desc    降序查询,asc是升序

select name from person group by name having count(*)>1    分组查询 

select * from Account limit 5 offset 3         分页查询    123456

6、对表进行操作alert

 

增加一列: alert(into) person add address varchar(255);

删除列: alert person drop column age;

重命名列: alert person change age age_number integer;

**四、实例用法:**

写法,传统的一般的sql语句和insert方法,除了用execSQL()之外,还有
insert()、delete()、update()和query()  能完成数据的添加、删除、更新、查询操作。

1、插入
(1)
SQLiteDatabase db = ....;   
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"炸死特", 4});     
db.close();  

execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
用占位符可以省去转义的痛苦。以免里面参数多次进行转义。
(2)
Insert()方法用于添加数据,各个字段的数据使用ContentValues进行存放,ContentValues类似于map集合,它提供了存取数据对应的put(String key, Xxx value)和getAsXxx(String key)方法,  key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:String、Integer等。

SQLiteDatabase db = databaseHelper.getWritableDatabase();    
ContentValues values = new ContentValues();    
values.put("name", "炸死特");    
values.put("age", 4);    
long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关  

2、查询:1234567891011121314151617181920212223242526272829

(1) 
SQLiteDatabase db = ….; 
Cursor cursor = db.rawQuery(“select * from person where name like ? and age=?”, new String[]{“%炸死特%”, “4”}); 
while (cursor.moveToNext()) { 
  int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始 
  String name = cursor.getString(1);//获取第二列的值 
  int age = cursor.getInt(2);//获取第三列的值 

cursor.close(); 
db.close();  

 

Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。

(2)
SQLiteDatabase db = databaseHelper.getWritableDatabase();    
Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%炸死特%"}, null, null, "personid  desc", "1,2");  

while (cursor.moveToNext()) {  
         int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始   
          String name = cursor.getString(1);//获取第二列的值  
          int age = cursor.getInt(2);//获取第三列的值   
}   
cursor.close();  
db.close();       
query参数,
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各

**参数的含义:**
table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句group by关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。
3.删除
(1)DELETE FROM table_name
或者:
DELETE * FROM table_name
     当然要加上条件判断,
   SQLiteDatabase db = databaseHelper.getWritableDatabase();  
  db.execSQL("delete from  table person where age >2 ");  
  db.close();  
(2)
SQLiteDatabase db = databaseHelper.getWritableDatabase();  
db.delete("person", "personid<?", new String[]{"2"});  
db.close();  

上面代码用于从person表中删除personid小于2的记录。
第一个是表名,第二个参数是条件,相当于where personid<    ,?是占位符,内容是第三个参数。
5.update()方法
(1)123456789101112131415161718192021222324252627282930313233343536373839404142

SQLiteDatabase db = databaseHelper.getWritableDatabase(); 
 db.execSQL(“update person set name=’呵呵’ where personid=1”); 
 db.close(); 
“` 
(2) 
SQLiteDatabase db = databaseHelper.getWritableDatabase(); 
ContentValues values = new ContentValues(); 
 values.put(“name”, “呵呵”);//key为字段名,value为值 
db.update(“person”, values, “personid=?”, new String[]{“1”}); 
db.close();  

上面代码用于把person表中personid等于1的记录的name字段的值改为“呵呵”。
--------------------- 
原文:https://blog.csdn.net/qq_37237245/article/details/72677163 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

SQLlite在安卓中的基本详解和简单使用 的相关文章

  • vs环境下C++dll生成和使用(基础篇)

    动态库和静态库 xff1a 动态库 xff1a 全名动态链接库 xff0c 用于将你的函数封装 xff0c 让别人只能调用 xff0c 不能看你的实现代码 由引入库和dll组成 xff1a 引入库包含导出的函数和变量名 xff0c dll包
  • #ifndef.#define, #endif 的用法

    文件中的 ifndef define endif 很关键 xff0c 是为了避免多重包含 xff0c 比如如果两个C文件同时包含同一头文件 xff0c 那么就会出现问题 xff0c 所以使用这种方法可以有效避免这种情况 一般用法 xff1a
  • 关于.NET编译的目标平台(AnyCPU,x86,x64)

    在VisualStudio中项目平台属性包含x86 x64 AnyCPU三个选项 xff0c 之前的项目中并没有特别去关注这一点 xff0c 最近的项目中涉及到了在不同平台运行的问题 xff0c 所以专门了解并整理了这方面的知识 x86 x
  • IP地址不是唯一的吗?为什么路由器的IP地址都是这样的呢?

    路由器同时连接外部网络和内部网络 xff0c 外部网络的IP是都不一样 xff0c 但内部网络的IP xff0c 就没有问题 xff0c 但内部网络所有设备的IP也不能相同 域名是对你的网站存放主机的ip的解析 xff0c 可以理解为你的别
  • HTTP简介

    HTTP协议是Hyper Text Transfer Protocol xff08 超文本传输协议 xff09 的缩写 是用于从万维网 xff08 WWW World Wide Web xff09 服务器传输超文本到本地浏览器的传送协议 H
  • OMF和flash_recovery_area的关系!

    在OMF出现之前 9i R1 oracle db的文件 xff0c 主要指dbf xff0c redo xff0c ctl是通过os管理的 xff0c 为了简化对数据库文件的管理 xff0c oracle引入了OMF 通过omf创建的dbf
  • asp.net发布网站的详细步骤

    1 用VS2013打开解决方案 2 选中解决方案 xff0c 点击鼠标 右键 gt 从弹出对话框中 xff0c 选择 清理解决方案 3 待第2步 清理解决方案 结束后 xff0c 选中 解决方案 gt 点击鼠标 右键 gt 在弹出对话框中
  • 域名和IP地址是一回事吗?建网站要买域名还要买IP地址吗?

    去年我在网通花了150元买了一个域名 xff0c 他们在登记单上的域名费一栏填了150元 xff0c 登记单上还有IP使用费一栏他们什么也没有填写 xff0c 如果域名与IP地址是同一个项目 xff0c 是一回事 xff0c 他们不是在重复
  • IIS服务器绑定域名问题

    不能将内网的IP地址和互联网的域名绑定 xff0c 如果这样做 xff0c 那么只有内网可以通过域名访问网站 xff0c 外网无法通过域名访问网站 域名ip地址绑定 xff0c 必须是固定ip地址 xff0c 还必须是公网ip地址 需要公网
  • asp网站配置错误解决汇总_1

    由于扩展配置问题而无法提供您请求的页面 如果该页面是脚本 请添加处理程序 错误 xff1a HTTP 错误 404 3 Not Found 由于扩展配置问题而无法提供您请求的页面 如果该页面是脚本 xff0c 请添加处理程序 如果应下载文件
  • 如何在本地服务器绑定域名及host文件的使用说明

    在本地服务器绑定域名 xff1a 打开C WINDOWS system32 drivers etc 目录下面的hosts文件 xff0c 把127 0 0 1 localhost复制 xff0c 粘贴到文件的最后 xff0c 然后把loca
  • 内网访问不到内网网站问题和不用端口号访问网站问题

    windows防火墙 xff0d 高级 xff0d 网络连接设置 xff0d 设置 xff0d 服务 xff0d web服务器 xff0c 在这个位置可以打开80端口 怎样让自建网站在内外网访问时不用加端口名 怎样让自建网站在内外网访问时不
  • vs2010本地调试打不开网页

    在C WINDOWS system32 drivers etc这个文件夹下 找到Hosts文件 用记事本打开 localhost设为127 0 0 1
  • asp文件上传和下载

    ASP NET实现上传文件 前端 界面十分简单 xff0c 只是放一个file类型的 lt input gt 和一个按钮 xff0c 并且为这个按钮添加点击事件 xff08 btnUpLoad Click xff09 xff0c 如下图 x
  • 安装包,创建快捷方式,开机启动项,配置文件参数覆盖窗体类库

    using IWshRuntimeLibrary using System using System Collections Generic using System ComponentModel using System Data usi
  • C#程序以管理员权限运行

    C 程序以管理员权限运行 在Vista 和 Windows 7 及更新版本的操作系统 xff0c 增加了 UAC 用户账户控制 的安全机制 xff0c 如果 UAC 被打开 xff0c 用户即使以管理员权限登录 xff0c 其应用程序默认情
  • C#修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限

    写在前面 在windows系统中 xff0c c盘中的目录权限比较高 xff0c 有时制作安装包的时候 xff0c 默认的安装路径就是在c盘 xff0c 但对运行可执行文件 xff0c 有时候需要为其添加完全控制权限 xff0c 或者读写权
  • ASP.NET简易教程-页面布局

    页面布局 网上有太多介绍 xff0c 个人觉得不错的有 Div 43 CSS布局大全 xff0c 有PDF版本 xff0c 可下载离线观看 xff0c 别人总结的一个文档 xff0c 简洁易懂 xff0c 学起来不费劲 xff0c 花时间不
  • File.Create创建文件后,需要释放…

    if File Exists SavePath File Create SavePath Close
  • 最全CSS各种布局详解

    一 单列布局的实现 1 单列布局中最常用的水平居中的四种方法 同时设置父元素和子元素的样式 xff1a 父元素使用text align实现 xff0c 子元素使用inline block 这里宽高背景只是为了展示 parent text a

随机推荐

  • Android开发的之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同 xff0c 都是事件驱动 给控件添加事件也有接口回调和委托代理的方式 今天这篇博客就总结一下Android中常用的基本控件以及布局方式 说到布局方式Android和iOS还是
  • 为Android Studio中的SettingsActivity定制任务栏 (Setting Activity其实本质上是从PreferenceActivity中继承过来的)

    Android Studio为开发者提供了很多内建的Activity 其中Settings Activity是非常有用且功能强大的一种内建Activity Setting Activity其实本质上是从PreferenceActivity中
  • Android设置页面PreferenceFragment使用详细+代码分析

    Android设置页面PreferenceFragment使用详细 文章目录Android设置页面PreferenceFragment使用详细一 设置页面核心代码二 设置页面布局核心代码三SettingFragment核心代码四 setti
  • Android Studio 上Activity的互相切换

    Activity上有两个按钮 xff0c 切换到其他两个Activity 1 先创建两个Button xff0c 一个Textview 2 给两个Button添加监听器 xff0c 实现如下代码 public class MainActiv
  • Android中的Intent和Intent-filter总结

    一 xff0e 相关概念 xff08 一 xff09 基本概念 Intent中文意思指 意图 按照Android的设计理念 Android使用Intent来封装程序的 调用意图 不管启动Activity Service BroadcastR
  • C#接口中为什么不能像java那样使用static?

    我印象中java里面的接口使用static final修饰的常量 xff0c 不是成员方法 xff0c 使用static修饰的method放在接口中是无意义的 xff0c 接口是用来抽象的 与Java不同 xff0c C 中的接口不能包含域
  • JVM(2)九个部分 p4

    文章目录 1 九大部分1 1 类加载子系统1 2 方法区1 3 堆1 4 直接内存1 5 jvm栈1 6 本地方法栈1 7 垃圾回收系统1 8 PC寄存器1 9 执行引擎 2 堆 栈 方法区的联系3 Java堆的不同结构4 对象已经死了吗4
  • 通过点击事件监听 setOnClickListener 彻底理解回调-Android

    前言 老司机们对于回调肯定熟悉得不能再熟悉了 但是新司机可能还是一脸懵逼的 xff0c 我比较笨 xff0c 当年懵逼了好久 xff0c 看夏安明的这一篇博客地址 xff0c 虽然下边的留言都是 xff0c 写得好 xff01 懂了懂了 x
  • Java 接口和抽象类可以被new么?——顺便总结内部类

    转载 xff1a https blog csdn net hackersaillen article details 47281549 背景 xff1a 最近有同事跟我说了他面试时遇到的问题 xff0c 考官问 xff1a 接口和抽象类可以
  • java之方法的重写

    方法的重写 xff1a 1 在子类中可以根据需要对从基类中继承来的方法进行重写 2 重写的方法和被重写的方法必须具有相同方法名称 参数列表和返回类型 3 重写方法不能使用比被重写的方法更严格的访问权限 程序code class Person
  • Android中传递对象的三种方法

    Android中 xff0c Activity和Fragment之间传递对象 xff0c 可以通过将对象序列化并存入Bundle或者Intent中进行传递 xff0c 也可以将对象转化为JSON字符串 xff0c 进行传递 序列化对象可以使
  • Android中BroadCastReceiver使用(整理)

    BroadcastReceiver 在Android中 xff0c Broadcast是一种广泛运用的在应用程序之间传输信息的机制 而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件 下面将详
  • Android的联通性---USB主机模式(三)

    获取跟设备通信的权限 在跟USB设备进行通信之前 xff0c 你的应用程序必须要获取用户的许可 注意 xff1a 如果你的应用程序使用Intent过滤器来发现接入的USB设备 xff0c 而且用户允许你的应用程序处理该Intent xff0
  • android USB

    google 在推出API 3 0后 就增加啦USB通讯这块 同时为API 2 3提供啦一个USB通讯吧 xff0c 这样也让2 3有啦USB通讯功能 不过只支持USBAccessory模式 USB通讯分为两种模式 xff1a xff08
  • 入门 Kotlin 和 Java 混合开发

    一 前沿 如果你学习过其他的编程语言 xff0c 你就会发现 Java 的语法很是哆嗦 xff0c 可是我们为什么没有放弃 Java 这门编程语言呢 xff1f 因为 JVM 是一个非常好的平台 xff0c 而且 Java 程序员目前在中国
  • kotlin 和java 混编

    如果你之前使用 Java 语言而没有 Kotlin 开发经验 xff0c 不用担心 xff0c Intellij IDEA 会帮你一键转换 xff0c 将 Java 代码转换成 Kotlin 代码 但是反过来就不行了 在 Mac 上 xff
  • Kotlin 基础语法

    Kotlin 文件以 kt 为后缀 包声明 代码文件的开头一般为包的声明 xff1a package com runoob main import java util fun test class Runoob kotlin源文件不需要相匹
  • ‘break‘ not in the ‘loop‘ or ‘switch‘ context

    使用phpexcel导出表格 xff0c 切换到php7 0报错 错误地址 xff1a FILE ThinkPHP Library Vendor phpexcel PHPExcel Calculation Functions php LIN
  • Android数据存储之SQLite

    概览 l 概述 l CRUD方法详解 l 注意事项 概述 对于大量数据的处理 xff0c 如果不想将数据存于服务器端 xff0c Android API提供了对关系数据库SQLite的支持 xff0c 在android SDK中tool目录
  • SQLlite在安卓中的基本详解和简单使用

    一 基础介绍 1 SQLite 是一个进程内的库 是一种轻量级的 自给自足的 无服务器的 无需配置的 事务性的SQL数据库引擎 和他其他的数据库一样 xff0c SQLite引擎不是一个独立的进程 xff0c 可以按应用程序需求进行静态或动