android开发中的数据库SQLite的使用

2023-05-16

其实学习android很久了,关于数据存储,之前学习的时候也一同学习过,编程这些东西很久没用都忘得差不多了,最近做个项目要用到,所以又学习了一遍。

android中关于数据的存储有好几种,这次主要是SQLite的使用。

首先说一点,我的技术很烂,原理什么的不说了,就是讲一下怎么使用,包括“增删改查”这几个操作。

使用数据库的前提是有数据库,有表,所以我们首先是要有一个数据库,然后还得建一张表(至少一张表)。sql语句就是“create table XXX()”。作为一个数据库系统,SQLite也是遵守SQL92标准的,和其他的数据库都差不多,所以有过数据库开发经验的对这些sql语句都不陌生。

  开发中使用数据库

  创建数据库

      android中提供了SQLiteOpenHelper这个类来帮助你管理数据库。包括创建和更新数据库。所以你只要继承SQLiteOpenHelper类来对数据库进行管理就行。

复制代码


public class DBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "test.db";
    private static final int DATABASE_VERSION = 1;
    public DBHelper(Context context){
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                " name VARCHAR,age INTEGER, info TEXT)");//建表,对数据库进行操作等

    }

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        db.execSQL("ALTER TABLE person COLUMN other STRING");
    }
}  

复制代码


SQLiteOpenHelper类的构造函数有四个参数
  

public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
        this(context, name, factory, version, null);
    }  

这是我在sdk源代码SQLiteOpenHelper类中复制的。context代表上下文,name是数据库名字,factory是游标工厂,一般情况下为null值,version是数据库版本,软件在今后的升级中会用到。

  在构造函数中就会创建数据库。

  使用数据库

  数据库已经创建好,通常我们通过getReadAbleDatabase()或getWriteableDatabase()方法来获取一个数据库实例。可以在onCreate()方法中对数据库进行操作。不过为了便于管理,还是建议大家重新写一个专门的工具类。

  创建表

其实在onCreate()方法中就是在创建表。


db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                " name VARCHAR,age INTEGER, info TEXT)");
表名是person,_id是主键,为自增长,name是verchar型,age是integer型,info是text型。  

   表操作

  表的操作就是增删改查,android中提供了两种方法(就我知道的)。分别是sql语句和封装好的insert(),delete(),update(),query()。后边的这些方法也是对sql语句的封装。

    

  db.execSQL("insert into ....");  

  还有就是

  ContentValues cv = new ContentValues();

  cv.put();

  cv.put();

  db.insert("tableName",getNullColunmHack(),cv);

  函数原型是insert(String table, String nullColumnHack, ContentValues values),其实insert()的底层也是execSQL()。

  删

  和添加的操作差不多。db.execSQL()和db.delete()

  改

  和上边两个操作的也是相同的。

  查

  因为查询的结果是返回一个游标(Cursor)。rawQuery(String sql, String[] selectionArgs)。通过移动游标来进行数据的查询。

复制代码


 1         Cursor c = db.rawQuery("SELECT * FROM person", null);
 2         while(c.moveToNext()){
 3             Person p = new Person();
 4             p.set_id(c.getInt(c.getColumnIndex("_id")));
 5             p.setName(c.getString(c.getColumnIndex("name")));
 6             p.setAge(c.getInt(c.getColumnIndex("age")));
 7             p.setInfo(c.getString(c.getColumnIndex("info")));
 8             persons.add(p);
 9         }
10         c.close();                  

复制代码

所有的操作也差不多就是这些。

最后添加几张截图。

最后是全部源代码

activity.java

复制代码


  1 package com.sqlitedemo.activity;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.view.View;
  6 import android.widget.Button;
  7 import android.widget.ListView;
  8 import android.widget.SimpleAdapter;
  9 import android.widget.Toast;
 10 
 11 import com.tiancz.sqlitedemo.R;
 12 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.DBManager;
 13 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.Person;
 14 
 15 import java.util.ArrayList;
 16 import java.util.HashMap;
 17 import java.util.List;
 18 import java.util.Map;
 19 
 20 /**
 21  * Created by tiancz on 2015/3/7.
 22  */
 23 public class activity00 extends Activity {
 24 
 25     private DBManager dm;
 26     private ListView lv;
 27 
 28     private Button add;
 29     private Button query;
 30     private Button update;
 31     private Button delete;
 32     private Button drop;
 33     @Override
 34     protected void onCreate(Bundle savedInstanceState) {
 35         super.onCreate(savedInstanceState);
 36         setContentView(R.layout.activity00);
 37 
 38         lv = (ListView)findViewById(R.id.lv_00);
 39         query = (Button)findViewById(R.id.query00);
 40         add = (Button)findViewById(R.id.add00);
 41         update = (Button)findViewById(R.id.update00);
 42         delete = (Button)findViewById(R.id.deleteAll00);
 43         drop = (Button)findViewById(R.id.drop00);
 44 
 45         dm = new DBManager(this);
 46 
 47         add.setOnClickListener(new View.OnClickListener() {
 48             @Override
 49             public void onClick(View v) {
 50                 add(v);
 51             }
 52         });
 53 
 54         query.setOnClickListener(new View.OnClickListener() {
 55             @Override
 56             public void onClick(View v) {
 57                 query(v);
 58             }
 59         });
 60 
 61         update.setOnClickListener(new View.OnClickListener() {
 62             @Override
 63             public void onClick(View v) {
 64                 update(v);
 65             }
 66         });
 67 
 68         delete.setOnClickListener(new View.OnClickListener() {
 69             @Override
 70             public void onClick(View v) {
 71                 deleteALL(v);
 72             }
 73         });
 74 
 75 //        drop.setOnClickListener(new View.OnClickListener() {
 76 //            @Override
 77 //            public void onClick(View v) {
 78 //                dropTable(v);
 79 //            }
 80 //        });
 81     }
 82 
 83 
 84     @Override
 85     protected void onDestroy(){
 86         super.onDestroy();
 87         dm.closeDB();
 88     }
 89 
 90     public void add(View view){
 91         List<Person> persons = new ArrayList<>();
 92         Person p1 = new Person("tom",21,"lively boy");
 93         Person p2 = new Person("bill",23,"handsome");
 94         Person p3 = new Person("gate",22,"sexy boy");
 95         Person p4 = new Person("joe",24,"hot boy");
 96         Person p5 = new Person("jhon",29,"pretty");
 97 
 98         persons.add(p1);
 99         persons.add(p2);
100         persons.add(p3);
101         persons.add(p4);
102         persons.add(p5);
103 
104         dm.add(persons);
105     }
106     public void update(View view){
107         Person p = new Person();
108         p.setName("jhon");
109         p.setAge(40);
110         dm.updateAge(p);
111     }
112 
113     public void deleteALL(View view){
114         dm.delete();
115     }
116 
117     public void delete(View view){
118         Person p = new Person();
119         p.setAge(30);
120         dm.deleteOldPerson(p);
121     }
122 
123 //    public void dropTable(View view){
124 //        dm.dropTable();
125 //    }
126 
127     public void query(View view){
128         List<Person>persons    = dm.findAllPerson();
129         ArrayList<Map<String,String>> list = new ArrayList<>();
130         for (Person p:persons){
131             HashMap<String,String>map = new HashMap<>();
132             map.put("name",p.getName());
133             map.put("info","No."+p.get_id()+" "+p.getAge()+" years old,"+p.getInfo());
134             list.add(map);
135         }
136         SimpleAdapter adapter = new SimpleAdapter(this,list,android.R.layout.simple_list_item_2,
137                 new String[]{"name","info"},new int[]{android.R.id.text1,android.R.id.text2});
138         lv.setAdapter(adapter);
139         if(list.isEmpty()){
140             Toast.makeText(this,"列表里还没人呢",Toast.LENGTH_SHORT).show();
141         }
142     }
143 }  

复制代码

activity.xml

复制代码


 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3               android:layout_width="match_parent"
 4               android:layout_height="match_parent"
 5               android:orientation="vertical">
 6 
 7     <Button
 8         android:id="@+id/add00"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="Add"/>
12     <Button
13         android:id="@+id/update00"
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:text="update"/>
17     <Button
18         android:id="@+id/deleteAll00"
19         android:layout_width="wrap_content"
20         android:layout_height="wrap_content"
21         android:text="deleteAll"/>
22     <Button
23         android:id="@+id/delete00"
24         android:layout_width="wrap_content"
25         android:layout_height="wrap_content"
26         android:text="delete"/>
27     <Button
28         android:id="@+id/drop00"
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:text="drop"/>
32     <Button
33         android:id="@+id/query00"
34         android:layout_width="wrap_content"
35         android:layout_height="wrap_content"
36         android:text="query"/>
37 
38     <ListView
39         android:id="@+id/lv_00"
40         android:layout_width="fill_parent"
41         android:layout_height="wrap_content">
42     </ListView>
43 </LinearLayout>  

复制代码

DBHelper.java

复制代码


 1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
 2 
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 
 7 /**
 8  * Created by tiancz on 2015/3/8.
 9  */
10 public class DBHelper extends SQLiteOpenHelper {
11     private static final String DATABASE_NAME = "test.db";
12     private static final int DATABASE_VERSION = 1;
13     public DBHelper(Context context){
14         super(context,DATABASE_NAME,null,DATABASE_VERSION);
15     }
16 
17     @Override
18     public void onCreate(SQLiteDatabase db){
19         db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
20                 " name VARCHAR,age INTEGER, info TEXT)");
21 
22     }
23 
24     @Override
25     public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
26         db.execSQL("ALTER TABLE person COLUMN other STRING");
27     }
28 }  

复制代码

DBManager.java

复制代码


 1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
 2 
 3 import android.content.ContentValues;
 4 import android.content.Context;
 5 import android.database.Cursor;
 6 import android.database.sqlite.SQLiteDatabase;
 7 
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 /**
12  * Created by tiancz on 2015/3/8.
13  */
14 public class DBManager {
15     private DBHelper helper;
16     private SQLiteDatabase db;
17 
18     public DBManager(Context context){
19         helper = new DBHelper(context);
20         db = helper.getWritableDatabase();
21     }
22 
23     public void add(List<Person> persons){
24         db.beginTransaction();
25         try{
26             for (Person p:persons){
27                 db.execSQL("INSERT INTO person VALUES(null,?,?,?)",
28                         new Object[]{p.getName(),p.getAge(),p.getInfo()});
29             }
30             db.setTransactionSuccessful();
31         }catch(Exception e){
32             e.printStackTrace();
33         }finally {
34             db.endTransaction();
35         }
36     }
37 
38     public void updateAge(Person p){
39         ContentValues cv = new ContentValues();
40         cv.put("age",p.getAge());
41         db.update("person",cv,"name=?",new String[]{p.getName()});
42     }
43 
44     public void delete(){
45         db.execSQL("delete from person where name='tom'");
46         db.execSQL("delete from person where name='bill'");
47         db.execSQL("delete from person where name='gate'");
48         db.execSQL("delete from person where name='joe'");
49         db.execSQL("delete from person where name='jhon'");
50     }
51 
52     public void deleteOldPerson(Person p){
53         db.delete("person","age=?",new String[]{String.valueOf(p.getAge())});
54     }
55 
56     public List<Person> findAllPerson(){
57         ArrayList<Person> persons = new ArrayList<Person>();
58         Cursor c = db.rawQuery("SELECT * FROM person", null);
59         while(c.moveToNext()){
60             Person p = new Person();
61             p.set_id(c.getInt(c.getColumnIndex("_id")));
62             p.setName(c.getString(c.getColumnIndex("name")));
63             p.setAge(c.getInt(c.getColumnIndex("age")));
64             p.setInfo(c.getString(c.getColumnIndex("info")));
65             persons.add(p);
66         }
67         c.close();
68         return persons;
69     }
70 
71 //    public void dropTable(){
72 //        db.execSQL("drop table person");
73 //    }
74 
75     public void closeDB(){
76         db.close();
77     }
78 
79 
80 }  

复制代码

Person.java

复制代码


 1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
 2 
 3 /**
 4  * Created by tiancz on 2015/3/8.
 5  */
 6 public class Person {
 7     private int _id;
 8     private String name;
 9     private int age;
10     private String info;
11 
12     public Person(){}
13 
14     public Person(String name,int age,String info){
15         this.name=name;
16         this.age=age;
17         this.info=info;
18     }
19 
20     public int get_id() {
21         return _id;
22     }
23 
24     public void set_id(int _id) {
25         this._id = _id;
26     }
27 
28     public int getAge() {
29         return age;
30     }
31 
32     public void setAge(int age) {
33         this.age = age;
34     }
35 
36     public String getName() {
37         return name;
38     }
39 
40     public void setName(String name) {
41         this.name = name;
42     }
43 
44     public String getInfo() {
45         return info;
46     }
47 
48     public void setInfo(String info) {
49         this.info = info;
50     }
51 }  

复制代码

这就是全部的代码。

  总结

  刚开始做的时候忘了实例化DBManager,所以导致无法对数据库进行操作,一直显示的空指针异常,看了好久才发现忘了这一句

  dm = new DBManager(this);

  对于信息越来越多,数据库的使用越发显得重要。学习android,数据库的学习必不可少。

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

android开发中的数据库SQLite的使用 的相关文章

  • #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 可以按应用程序需求进行静态或动
  • android开发中的数据库SQLite的使用

    其实学习android很久了 xff0c 关于数据存储 xff0c 之前学习的时候也一同学习过 xff0c 编程这些东西很久没用都忘得差不多了 xff0c 最近做个项目要用到 xff0c 所以又学习了一遍 android中关于数据的存储有好