技术标签: sqlite android 数据库 Android
【实验名称】实验六、contentprovider实验+SQLite数据库的实现
【实验目的】
1、掌握如何在Android 开发中使用 SQLite 数据库
2、熟悉设计数据库表结构的方法与步骤
3、理解contentprovider的使用方法及流程,理解ContentProvider、Resolver、Uri、Urimatcher等的原理。
【实验内容】
1、实现contentprovider和contentresolver通过uri的调用;
2、实现contentprovider对数据库sqlite的功能:增、删、改、查;
3、数据库的表结构自行设计;
【实验要求】
1、配置SQLite 数据库的运行环境
2、熟悉contentprovider对数据库sqlite增、删、改、查的具体操作和流程
3、充分理解SQLite数据库的使用原理和方式
(请完成如下部分)
【实验设计】
1、设置Activity,通过按钮设置监听,而通过正确的uri来调用自定义的 ContentProvider: 匹配合适的uri之后,通过getContentResolver()去操作数据库。
public class MainContentProvider extends AppCompatActivity {
TextView text;
EditText username;
EditText phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_content_provider);
text = findViewById(R.id.ContactTV);
username = findViewById(R.id.username);
phone = findViewById(R.id.phone);
}
public void queryClick(View view){
text.setText("");
String id = username.getText().toString();
Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user/" + id);
Cursor cursor = getContentResolver().query(uri,null,null,null,null);
excuteCursor(cursor);
}
public void queryAll(View view){
// text.setText("");
Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user" );
Cursor cursor = getContentResolver().query(uri,null,null,null,null,null);
excuteCursor(cursor);
}
public void insertClick(View view){
String name = username.getText().toString();
String phone1 = phone.getText().toString();
Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
ContentValues values = new ContentValues();
values.put("username",name);
values.put("phone",phone1);
getContentResolver().insert(uri, values);
Toast.makeText(this,"已插入",Toast.LENGTH_SHORT).show();
username.setText("");
phone.setText("");
}
public void deleteClick(View view){
String name = username.getText().toString();
Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
getContentResolver().delete(uri,"username=?",new String[]{
name});
Toast.makeText(this,"已删除",Toast.LENGTH_SHORT).show();
}
public void updateClick(View view){
String name = username.getText().toString();
String pho = phone.getText().toString();
Uri uri = Uri.parse("content://com.example.ContentProvider.provider/user");
ContentValues values = new ContentValues();
values.put("username",name);
values.put("phone",pho);
getContentResolver().update(uri,values,"username=?",new String[]{
name});
Toast.makeText(this,"已修改",Toast.LENGTH_SHORT).show();
}
@SuppressLint("SetTextI18n")
private void excuteCursor(Cursor cursor) {
if(cursor!=null){
text.setText("");
while (cursor.moveToNext()){
int uid = cursor.getInt(0);
String username = cursor.getString(1);
String password = cursor.getString(2);
text.append("联系人ID:"+uid+"\n联系人姓名:"+username+" " +
" 联系人电话:"+password+"\n");
System.out.println("联系人ID:"+uid+"\n联系人姓名:"+username+" " +
" 联系人电话:"+password+"\n");
}
}
// cursor.close();
}
}
2、MyProvider :
(1)自定义ContentProvider,根据Activity传来的uri进行匹配,匹配到符合的则开始 SQLiteDatabase 来将一些操作数据库的方法接口对Activity进行暴露(提供给Activity),使得Activity可通过 contentresolver 可对数据库进行操作。
(2) 还需要在AndroidManifest.xml中注册 contentprovider:
<provider
android:authorities="com.example.ContentProvider.provider"
android:name="com.example.ContentProvider.MyProvider"
android:exported="true" >
</provider>
(3)MyProvider :
①声明 contentprovider 的authorities (主机名)及uri(资源标识符)
public class MyProvider extends ContentProvider {
MySQLite mySQLite;
SQLiteDatabase db;
public static final int USER_DIR = 0;
public static final int USER_ITEM = 1;
public static final String authority ="com.example.ContentProvider.provider";
public static UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 默认不匹配uri
uriMatcher.addURI(authority,"user",USER_DIR); //为0 为 com.example.ContentProvider.provider/user :对整张表操作
uriMatcher.addURI(authority,"user/#",USER_ITEM); // 为1 则为 com.example.ContentProvider.provider/user/1, user此表的第一行
}
//
@Override
public boolean onCreate() {
mySQLite = new MySQLite(getContext(),"userphone.db",null,1);
// 构造数据库(获取上下文、数据库文件名称,不用工厂,版本为1)
db = mySQLite.getWritableDatabase(); // 创建可写数据库
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
// 查询 , 匹配uri
Cursor cursor = null;
switch (uriMatcher.match(uri)){
case USER_DIR:
cursor = db.query("user",projection,selection,selectionArgs,null,null,null);
break;
case USER_ITEM:
String queryid = uri.getPathSegments().get(1);
cursor = db.query("user", projection, "uid=?", new String[]{
queryid}, null, null, null);
break;
}
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
switch (uriMatcher.match(uri)){
case USER_DIR:
return "vnd.android.cursor.dir/vnd";
case USER_ITEM:
return "vnd.android.cursor.item/vnd.cn.edu.cdut.provider.user";
}
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
switch (uriMatcher.match(uri)){
case USER_DIR:
case USER_ITEM:
long l = db.insert("user", null, values);
System.out.println("=================="+l);
break;
default:
break;
}
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
int delete = 0;
switch (uriMatcher.match(uri)){
case USER_DIR:
delete = db.delete("user", selection, selectionArgs);
break;
case USER_ITEM:
String queryid = uri.getPathSegments().get(1);
delete = db.delete("user","uid =?",new String[]{
queryid});
break;
default:
break;
}
return delete;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
int update = 0;
switch (uriMatcher.match(uri)){
case USER_DIR:
update = db.update("user", values,selection, selectionArgs);
break;
case USER_ITEM:
String queryid = uri.getPathSegments().get(1);
update = db.update("user",values,"uid=?",new String[]{
queryid});
break;
default:
break;
}
return update;
}
}
3、 MySQLite :进行数据库表的创建
public class MySQLite extends SQLiteOpenHelper {
public MySQLite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
db.disableWriteAheadLogging();
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE user( uid integer primary key autoincrement," +
"username text not null," +
"phone text not null)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
【实验结果】
1、初始界面:
2、添加用户:
3、点击查询所有:
4、根据id查询用户:
5、删除用户:
删除成功:
6、修改ID为7的用户:
修改结果:
【实验分析或心得】
掌握了如何在Android 开发中使用 SQLite 数据库,熟悉设计数据库表结构的方法与步骤并且理解contentprovider的使用方法及流程,理解了ContentProvider、Resolver、Uri、Urimatcher等的原理。。
文章浏览阅读202次。packagecode;//importjava.awt.*;//importjava.awt.Canvas;//importjava.awt.event.*;//importjavax.swing.*;importjava.util.Random;importjavax.microedition.lcdui.*;//写界面所需要的包/***//***俄罗斯方块*高雷*2007年1..._240×320java游戏
文章浏览阅读779次,点赞14次,收藏19次。然后,实现系统的数据管理和服务功能,包括用户的注册与登录、电影的分类与展示、电影信息的查询与推荐、座位的选择与预订、在线支付与电子票生成等。此外,随着在线视频平台的兴起,越来越多的人选择在线观看电影,这对传统电影院产生了巨大的冲击。研究意义: 开发在线电影院售票平台对于提升用户的观影体验、优化电影院的运营效率、促进电影产业的发展具有重要的意义。该系统旨在通过技术手段解决传统电影院售票中的问题,提供一个集成化的电影信息展示、座位选择、在线支付和用户评价平台,同时也为电影院和电影制作方提供有效的工具。
文章浏览阅读509次。保护我们剩下的人的通话信息安全,使用TOX可以让你在和家人,朋友,爱人交流时保护你的隐私不受政府无孔不入的的偷窥.关于TOX:其他牛逼的软件因为一些细化服务问你要钱的时候, TOX分文不取 . 你用了TOX, 想干嘛就干嘛.网友评论:项目源码展示:源码测试效果:最后,如果你学C/C++编程有什么不懂的,可以来问问我哦,或许我能够..._基于c++的即时聊天系统设计
文章浏览阅读584次。鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)当Java服务在Linux系统中运行时,可能会出现swap分区被占用的内存泄露问题,导致系统性能下降或者崩溃。下面是该问题的故障及解决方法、底层结构、架构图、工作原理、使用场景详解和实际应用方式、原理详细描述、相关命令使用示例以及文献材料链接。_linux swap占用很高
文章浏览阅读662次。Alt+F11,然后插入-模块:复制下面代码到编辑窗口:Sub 半角标点符号转换为全角标点符号()'中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange..._替换半角宏
文章浏览阅读2.8k次。#.简介: WebView是Android提供的用来展示展示web页面的View,内部使用webkit浏览器引擎(一个轻量级的浏览器引擎),除了展示Web页面外,还可与Web页面内的JS脚本交互调用。WebView内部的WebSetting对象负责管理WebView的参数配置; WebViewClient负责处理WebView的各种请求和通知事件,在对应事件发生时会执行WebViewClient的对应回调; ChromeWebviewClient辅助Webview处理与JS一些交互......_android webview真正加载完成
文章浏览阅读1.6k次。_bitcoin 调试环境搭建
文章浏览阅读4.3k次,点赞93次,收藏94次。为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。本文介绍B样条曲线的基本概念:节点向量、支撑性、次数阶数、加权性质、节点生成算法等,为后续曲线计算打下基础。_样条曲线生成
文章浏览阅读902次。配置本地repo库下载我的阿里云盘文件文件放置#创建目录mkdir -p /opt/cloudera/parcel-repo/mkdir -p /opt/cloudera/cm/yum install createrepoCDH 6.2.0 的三个文件放到/opt/cloudera/parcel-repo/中,并且注意把sha256后缀的文件名修改为sha#执行createrepo命令生成rpm元数据 最终/opt/cloudera/parcel-repo/会多一个repodata目录_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line 76: /usr/java/jdk1.8.0_181
文章浏览阅读943次,点赞2次,收藏2次。uni.canvasToTempFilePath_uni.canvastotempfilepath
文章浏览阅读3.1k次。SRAM :静态RAM,不用刷新,速度可以非常快,像CPU内部的cache,都是静态RAM,缺点是一个内存单元需要的晶体管数量多,因而价格昂贵,容量不大。DRAM:动态RAM,需要刷新,容量大。SDRAM:同步动态RAM,需要刷新,速度较快,容量大。DDR SDRAM:双通道同步动态RAM,需要刷新,速度快,容量大。........................_sdram 干扰
文章浏览阅读7.3k次。假设表格有A、B、C、D四列数据,希望导入到你的数据库中表格table,对应的字段分别是col1、col2、col3、col4。_excel数据怎么生成sql语句