SQLlite在安卓中的基本详解和简单使用,来自阿里巴巴佛系Android程序员的指南

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

当调用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)”); //往表中增加一列

}

将会对比版本号,如果本身没有数据库,即数据库版本号为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);

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

2、插入

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

3、删除

delete from person where age=10;

4、更新

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

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 分页查询

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、查询:

(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关键字后面的部分
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

image

七大模块学习资料:如NDK模块开发、Android框架体系架构…

image

2021大厂面试真题:

image

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

zGv4Wg-1712553269631)]

七大模块学习资料:如NDK模块开发、Android框架体系架构…

[外链图片转存中…(img-gJpR4yoq-1712553269632)]

2021大厂面试真题:

[外链图片转存中…(img-GPdf3JaO-1712553269632)]

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 显示 SQLite 的数据,可以使用以下步骤: 1. 创建一个 SQLite 数据库,可以使用 SQLiteOpenHelper 类。 2. 在数据库创建表并插入数据。 3. 创建一个 RecyclerView 或 ListView 来显示数据。 4. 创建一个适配器来将数据绑定到 RecyclerView 或 ListView 上。 5. 在适配器查询 SQLite 数据库并将数据绑定到 RecyclerView 或 ListView 上。 以下是一个简单的示例代码: 首先,在 AndroidManifest.xml 文件添加以下代码: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 然后,在 MainActivity.java 创建一个 SQLiteOpenHelper 类: ```java public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mydatabase.db"; private static final int DATABASE_VERSION = 1; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"); db.execSQL("INSERT INTO mytable (name, age) VALUES ('John', 25)"); db.execSQL("INSERT INTO mytable (name, age) VALUES ('Mary', 30)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS mytable"); onCreate(db); } } ``` 接着,在 MainActivity.java 创建 RecyclerView 并设置适配器: ```java public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recyclerview); adapter = new MyAdapter(this); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); } @Override protected void onResume() { super.onResume(); adapter.notifyDataSetChanged(); } } ``` 然后,在 MyAdapter.java 查询 SQLite 数据库并将数据绑定到 RecyclerView 上: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private Cursor cursor; public MyAdapter(Context context) { this.context = context; cursor = getCursor(); } private Cursor getCursor() { DatabaseHelper dbHelper = new DatabaseHelper(context); SQLiteDatabase db = dbHelper.getReadableDatabase(); return db.rawQuery("SELECT * FROM mytable", null); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { if (!cursor.moveToPosition(position)) { return; } String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); holder.nameTextView.setText(name); holder.ageTextView.setText(String.valueOf(age)); } @Override public int getItemCount() { return cursor.getCount(); } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView nameTextView; public TextView ageTextView; public ViewHolder(@NonNull View itemView) { super(itemView); nameTextView = itemView.findViewById(R.id.name_textview); ageTextView = itemView.findViewById(R.id.age_textview); } } } ``` 最后,在 list_item.xml 定义 RecyclerView 的每个项目的布局: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:orientation="vertical"> <TextView android:id="@+id/name_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold"/> <TextView android:id="@+id/age_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp"/> </LinearLayout> ``` 这样就能在 Android 显示 SQLite 的数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值