Android 高手进阶教程(二)之----Android 数据库SQLiteDatabase的使用!!

在这里插入图片描述

直接进入主题~

Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences 存储;第三种就是数据库SQLiteDatabase 存储。

文件存储我就不用多说了,而SharedPreferences 可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。

今天我们将讲一下SQLiteDatabase 的使用**。** 而掌握SqliteDatabase ,将会我们接下来掌握ContentProvider 打下良好的基石**。**

为了让大家更好的掌握,我们手把手完成该节的Demo

第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.

img

第二步:创建一个新的类BooksDB.java 这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate.具体代码如下:

package com.android.tutor; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class BooksDB extends SQLiteOpenHelper { private final static String DATABASE\_NAME = "BOOKS.db"; private final static int DATABASE\_VERSION = 1; private final static String TABLE\_NAME = "books\_table"; public final static String BOOK\_ID = "book\_id"; public final static String BOOK\_NAME = "book\_name"; public final static String BOOK\_AUTHOR = "book\_author"; public BooksDB(Context context) { // TODO Auto-generated constructor stub super(context, DATABASE\_NAME, null, DATABASE\_VERSION); } //创建table @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE\_NAME + " (" + BOOK\_ID + " INTEGER primary key autoincrement, " + BOOK\_NAME + " text, "+ BOOK\_AUTHOR +" text);"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = "DROP TABLE IF EXISTS " + TABLE\_NAME; db.execSQL(sql); onCreate(db); } public Cursor select() { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db .query(TABLE\_NAME, null, null, null, null, null, null); return cursor; } //增加操作 public long insert(String bookname,String author) { SQLiteDatabase db = this.getWritableDatabase(); /\* ContentValues \*/ ContentValues cv = new ContentValues(); cv.put(BOOK\_NAME, bookname); cv.put(BOOK\_AUTHOR, author); long row = db.insert(TABLE\_NAME, null, cv); return row; } //删除操作 public void delete(int id) { SQLiteDatabase db = this.getWritableDatabase(); String where = BOOK\_ID + " = ?"; String\[\] whereValue ={ Integer.toString(id) }; db.delete(TABLE\_NAME, where, whereValue); } //修改操作 public void update(int id, String bookname,String author) { SQLiteDatabase db = this.getWritableDatabase(); String where = BOOK\_ID + " = ?"; String\[\] whereValue = { Integer.toString(id) }; ContentValues cv = new ContentValues(); cv.put(BOOK\_NAME, bookname); cv.put(BOOK\_AUTHOR, author); db.update(TABLE\_NAME, cv, where, whereValue); } }

第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout\_width="fill\_parent" android:layout\_height="fill\_parent" > <EditText android:id="@+id/bookname" android:layout\_width="fill\_parent" android:layout\_height="wrap\_content" > </EditText> <EditText android:id="@+id/author" android:layout\_width="fill\_parent" android:layout\_height="wrap\_content" > </EditText> <ListView android:id="@+id/bookslist" android:layout\_width="fill\_parent" android:layout\_height="wrap\_content" > </ListView> </LinearLayout>

第四步:修改SQLiteDatabaseDemo.java代码如下:

package com.android.tutor; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class SQLiteDatabaseDemo extends Activity implements AdapterView.OnItemClickListener { private BooksDB mBooksDB; private Cursor mCursor; private EditText BookName; private EditText BookAuthor; private ListView BooksList; private int BOOK\_ID = 0; protected final static int MENU\_ADD = Menu.FIRST; protected final static int MENU\_DELETE = Menu.FIRST + 1; protected final static int MENU\_UPDATE = Menu.FIRST + 2; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setUpViews(); } public void setUpViews(){ mBooksDB = new BooksDB(this); mCursor = mBooksDB.select(); BookName = (EditText)findViewById(R.id.bookname); BookAuthor = (EditText)findViewById(R.id.author); BooksList = (ListView)findViewById(R.id.bookslist); BooksList.setAdapter(new BooksListAdapter(this, mCursor)); BooksList.setOnItemClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(Menu.NONE, MENU\_ADD, 0, "ADD"); menu.add(Menu.NONE, MENU\_DELETE, 0, "DELETE"); menu.add(Menu.NONE, MENU\_DELETE, 0, "UPDATE"); return true; } public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch (item.getItemId()) { case MENU\_ADD: add(); break; case MENU\_DELETE: delete(); break; case MENU\_UPDATE: update(); break; } return true; } public void add(){ String bookname = BookName.getText().toString(); String author = BookAuthor.getText().toString(); //书名和作者都不能为空,或者退出 if (bookname.equals("") || author.equals("")){ return; } mBooksDB.insert(bookname, author); mCursor.requery(); BooksList.invalidateViews(); BookName.setText(""); BookAuthor.setText(""); Toast.makeText(this, "Add Successed!", Toast.LENGTH\_SHORT).show(); } public void delete(){ if (BOOK\_ID == 0) { return; } mBooksDB.delete(BOOK\_ID); mCursor.requery(); BooksList.invalidateViews(); BookName.setText(""); BookAuthor.setText(""); Toast.makeText(this, "Delete Successed!", Toast.LENGTH\_SHORT).show(); } public void update(){ String bookname = BookName.getText().toString(); String author = BookAuthor.getText().toString(); //书名和作者都不能为空,或者退出 if (bookname.equals("") || author.equals("")){ return; } mBooksDB.update(BOOK\_ID, bookname, author); mCursor.requery(); BooksList.invalidateViews(); BookName.setText(""); BookAuthor.setText(""); Toast.makeText(this, "Update Successed!", Toast.LENGTH\_SHORT).show(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mCursor.moveToPosition(position); BOOK\_ID = mCursor.getInt(0); BookName.setText(mCursor.getString(1)); BookAuthor.setText(mCursor.getString(2)); } public class BooksListAdapter extends BaseAdapter{ private Context mContext; private Cursor mCursor; public BooksListAdapter(Context context,Cursor cursor) { mContext = context; mCursor = cursor; } @Override public int getCount() { return mCursor.getCount(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView mTextView = new TextView(mContext); mCursor.moveToPosition(position); mTextView.setText(mCursor.getString(1) + "\_\_\_" + mCursor.getString(2)); return mTextView; } } }

第五步:运行程序效果如下:

img

img

img

img

img

img

img

img

第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。

另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:

img

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380887.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SQL-每日一题【1484. 按日期分组销售产品】

题目 表 Activities&#xff1a; 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 结果表结果格式如下例所示。 示例 1: 解题思路 前置知识 group_concat函数的功能   将group by产生的…

傅盛:猎豹移动在三个领域取得进步 手游业务受政策影响不大

雷帝网 乐天 11月22日报道 猎豹移动&#xff08;NYSE:CMCM&#xff09;昨日发布截至2018年9月30日的第三季度财报&#xff0c;财报显示&#xff0c;猎豹移动Q3总收入13.52亿元&#xff0c;同比增长16%&#xff0c;环比增长23%&#xff0c;超过公司业绩指引上线。 猎豹移动手游业…

傅盛:猎豹持有猎户星空约34%股权 未来或获控股权

雷帝网 乐天 8月21日报道 猎豹移动董事长、CEO傅盛昨日在电话会议上表示&#xff0c;猎豹移动更加重视国内市场。过去&#xff0c;猎豹的海外工具及国内工具由不同团队运营。现在&#xff0c;由统一的团队运营管理。 “我们还将猎豹在海外验证的模式复制到国内。”傅盛说&#…

猎豹MFC--不使用向导

在CMyApp类的类视图下点属性 找到消息 添加找到InitInstance加进去 添加OnPaint消息 添加左键消息 自动生成的头文件信息&#xff1a; 在客户区大小内画椭圆文字 以上两张图先画线后画圆 CClientDC dc(NULL) 传NULL 为桌面 串this为当前窗口 来自为知笔记(Wiz) 转载于:https:…

中国工具类App折戟海外,为什么只有猎豹移动杀出血路?

移动互联网下半场中国市场人口红利不再&#xff0c;“走出去”成为互联网公司不约而同的选择&#xff0c;BAT、蚂蚁金服、摩拜、ofo、美图等公司都在出海。不过&#xff0c;中国互联网公司出海的历史却可以追溯到移动互联网早期&#xff0c;很早之前就出现了海外小三巨头&#…

如何打造一款专属于自己的高逼格电脑桌面

作为一名电脑重度使用者&#xff0c;你是否拥有一款属于你自己的高逼格电脑桌面呢&#xff1f;你是不是也像大多数同学一样&#xff0c;会把所有的内容全部都堆积到电脑桌面&#xff0c;不仅找东西困难&#xff0c;由于桌面内容太多还会导致C盘空间不足&#xff0c;影响电脑的反…

【吐槽系列】如何用最贱蛋的方式将web程序变为桌面应用

#前言 实在是想吐个槽&#xff0c;最近公司有个活&#xff0c;想要将我们写的web网站套在一个浏览器壳子里面&#xff0c;愣装桌面应用&#xff08;zhuang b&#xff09;。然后健哥给我推荐了cef&#xff0c;顺道作者又手贱的去看了cefSharp和Xilium.CefGlue&#xff0c;不得不…

Java算法_ 杨辉三角(LeetCode_Hot100)

题目描述&#xff1a;题目描述&#xff1a;给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码…

树莓派系统烧录,连接电脑,电脑远程桌面控制树莓派(树莓派无屏幕,校园网)

1、系统烧录 本人初学树莓派&#xff0c;没买屏幕&#xff0c;在学校里&#xff0c;用的是校园网&#xff0c;没有路由器&#xff0c;所以没办法直接通过网线连接树莓派和路由器&#xff0c;好让电脑能远程桌面控制树莓派&#xff0c;所以只能用迂回的方法&#xff0c;先让电脑…

猎豹创建快捷网页

猎豹创建快捷网页 IE创建快捷网页&#xff1a;http://blog.csdn.net/wangboxian/article/details/7431404 猎豹&#xff1a;将下面的绿钩拖到桌面上即可 posted on 2014-01-04 01:56 周永强 阅读( ...) 评论( ...) 编辑 收藏 转载于:https://www.cnblogs.com/zhouyongqiang/p/…

学计算机的桌面,三个软件,干净你的电脑桌面,让你更高效工作学习!

文 | 谦行公子 首发 | 谦行公子 今天向大家推荐三个软件&#xff0c;为了就是让大家都拥有一个干净整洁的桌面&#xff0c;从此高效地学习生活&#xff5e;至于哪三个&#xff0c;接着看 相信很多人都有这样的经历&#xff0c;连续工作好几天甚至好几周&#xff0c;桌面上堆满…

数据通信——OSPF高级特性

引言 之前讲过的是OSPF简单特性&#xff0c;理解起来很简单&#xff0c;但是OSPF协议深层很全面&#xff0c;可以说&#xff0c;如果懂了OSPF协议&#xff0c;相当于链路状态协议也能一通百通了。下面是一些重点注意事项和知识点。 1.在大型网络中&#xff0c;OSPF的SPF计算…

第10集丨Vue 江湖 —— 表单输入绑定

目录 一、v-model1.1 基本用法1.2 值绑定1.3 修饰符1.3.1 .lazy1.3.2 .number1.3.3 .trim 二、总结2.1 案例2.2 效果 一、v-model 1.1 基本用法 功能&#xff1a; v-model指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件…

R爬取新浪财经网的股票数据

使用到的包是RCurl,通过这个包可以做一些网页讯息的抓取 先通过新浪财经的入口,选一只感兴趣的股票,再点击左边行情走势下的历史交易得到历史交易数据 常用的浏览器可以打开网页讯息的源代码: 首先读取包并用,读取该网址的信息,并按行对信息进行切割: library(RCurl) t…

本杰·格拉汉姆选股策略

转 本杰明格拉汉姆选股策略 第一部分&#xff1a;投资哲学 价值投资方法已为个人投资者和专业投资经理人员所广泛运用。此方法是在60年前&#xff0c;随着格拉汉姆和多德的大学教科书《证券分析》的发表而问世的&#xff0c;格拉汉也因此被誉为价值投资之父&#xff0c;重温一…

金融科技之交易:动量效应选股策略

金融科技之交易&#xff1a;动量效应选股策略 策略内容&#xff1a;代码整理角度计算标准化处理数据准备回归线的斜率两点连线的斜率由斜率计算角度计算模块的整合 绘制叠加图UI界面控件&#xff1a;QLabelQLineEditQPushButtonQComboBoxQTableWidget 信号与槽函数选择目标股票…

量化投资:研报文本挖掘选股策略

核心观点: ●借力研报&#xff0c;打造开放的量化选股模型 传统的多因子量化选股模型是封闭的&#xff0c;缺乏捕捉市场热点的能力&#xff0c;通过大数据技术&#xff0c;从财经媒体和分析师研报中捕捉热点和政策的变化&#xff0c;可以打造开放的量化选股模型。 分析师个股…

Pytorch源码搜索与分析

PyTorch的的代码主要由C10、ATen、torch三大部分组成的。其中&#xff1a; C10 C10&#xff0c;来自于Caffe Tensor Library的缩写。这里存放的都是最基础的Tensor库的代码&#xff0c;可以运行在服务端和移动端。PyTorch目前正在将代码从ATen/core目录下迁移到C10中。C10的代…

利用Python+Gephi生成刀塔霸业棋子关系图

刀塔霸业版本&#xff1a;2019年7月24日 Gephi下载地址&#xff1a;Download 目录 代码 Gephi效果图 词云图 更新 代码 代码如下&#xff1a; # -*- coding: utf-8 -*- """ author: d0t4 date: 2019/7/29 desc: 生成刀塔霸业中各棋子的关系…

用狼的处世哲学做SOHO 一

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; &#xff0d;&#xff0d;创业者要有象狼一…