Android学习笔记分享

Android--Day08

UNIQUE constraint failed: cart_info.id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)

mWDB.insert(TABLE_CART_NAME,null,contentValues);//nullColumnHack是指没有赋值的列(应该是)

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/com.example.day06__androidstudy/databases/SHOPPING

mWDB.endTransaction();

4个bug:

1.清空后不会立刻清空需要退出去再进来一次

2.快速点添加添加失败(新增数据会覆盖原来数据)

3.清空后再出来添加会崩溃(SQLiteDatabase关了)

int id = getIntent().getExtras().getInt("name");

int id = getIntent().getIntExtra("name",0);

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

Unable to create application com.example.day06__androidstudy.ShoppingCartApplication: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean

SharedPreference读取内容

java.lang.RuntimeException: Unable to resume activity {com.example.day06__androidstudy/com.example.day06__androidstudy.ShoppingCartDemo.Mall}: android.content.res.Resources$NotFoundException: String resource ID #0x4

Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x4:OnResume下set找不到textview

有时你想插入一个空行,在这种情况下ContentValues没有内容值,你应该使用 nullColumnHack。

例如,您想要在表中插入一个空行student(id, name),该表id是自动生成的并且name为空。你可以这样调用:

ContentValues cv = new ContentValues();

db.insert("student", "name", cv);

suppress range with an annotation

Andoid11之后,要求提前声明需要访问其他的软件包

contentPrivider的onCreate在应用启动的时候执行

at com.example.contentprividerclient.ContentWriteActivity.lambda$onCreate$1$com-example-contentprividerclient-ContentWriteActivity(ContentWriteActivity.java:58)

Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

今日总结:

1.购物车案例总结:

1.清空后不会立刻清空需要退出去再进来一次(原来的view中的内容仍然存在,解决方法:用remove方法移除view)

2.快速点添加添加失败(新增数据会覆盖原来数据,解决方法:发现是一个if语句错误导致只执行了else部分,将if部分改为cart.get Count() == 0成功解决)

3.清空后再出来添加会崩溃(SQLiteDatabase关了,这个比较复杂且离谱,首先是我设置每个Activity的onCreate方法openWriteLink,在Destory中关闭,但是finish会直接关闭。然后startActivity方法执行后才执行finish方法,所以新的Activiy生成时数据库没有关闭,finish后关闭导致新的Activity的数据库被上一个Activityfinish时关闭。解决方法:每次使用数据库现场用现场关)

这个案例耗时很久,看网课写了1/3,基本没有bug,剩下的2/3自己写,出现了很多问题。这次的案例给我提供了很多解决问题的新思路:比如商品展示界面,如果是以前,我会每一个商品写一个布局,挨个写监听事件,看网课学会了原来可以一个布局,然后用addview向里面加,以前有这种思路但是不会实践,看网课算是实操了一遍

2.ContentPrivider学习,完成了网课中的案例,遇到bug:Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

依次断点测试,最终发现问题出现在

user.setId(cursor.getInt(cursor.getColumnIndex(UserInfoContent._ID)));

最后发现时数据库创建时网课中是_id,而我是id,后来意识到这点改完后还是错误,最后想起来这个数据库并没有删除,他的id名称依旧是id,因此我卸载了该应用重新执行,成功解决

3.本周总结:

主要学习了中级控件和数据存储,完成了找回密码和购物车两个案例,以及实现了网课中的实例

下周计划:

1.按网课接着向后学习

2.复习之前写过的案例,整理巩固知识

Android--Day09

学习删除代码

Alt Shift + 方向键上下移行

mac中对应option + shift + 方向

String id = uri.getLastPathSegment();//拿到最后面的id

private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

private static final int USERS = 1;

private static final int USER = 2;

static {

URI_MATCHER.addURI(UserInfoContent.AUTHORITIES,"/user",USERS);

URI_MATCHER.addURI(UserInfoContent.AUTHORITIES,"/user/#",USER);

}

清单文件里面只配了Auto

后面乱写也行,因此需要加上匹配:

if (URI_MATCHER.match(uri) == USER){}

这样访问会严格按照要求来,提高安全

高版本Android需要动态配置权限

Ø 检查App是否开启了指定权限 l 调用ContextCompat的checkSelfPermission方法。

Ø 请求系统弹窗,以便用户选择是否开启权限 l 调用ActivityCompat的requestPermissions方法,即可命令系统自动弹出权限申请窗口。

Ø 判断用户的权限选择结果 l 重写活动页面的权限请求回调方法onRequestPermissionsResult,在该方法内部处理用户的权限选择结果。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){

}//版本判断

<uses-feature

android:name="android.hardware.telephony"

android:required="false" />

<users-feature>用于指定android应用程序是否需要某个硬件或软件资源的支持,否                 则不能正常运行。

ok:语句

break语句

contact数据库下的row_contact和data

我的理解:

插入一条contact_id,然后用此id向data数据库中插入数据,

记录了用户的通讯录所有数据,包括手机号,显示名称等,但是里面的mimetype_id表示不同的数据类 型,这与表mimetypes表中的id相对应,raw_contact_id 与下面的 raw_contacts表中的 id 相对应。

email.put("data2", "2"); // 联系类型。1表示家庭,2表示工作

resolver.insert(uri, email); // 往提供器添加联系人的邮箱记录 }

mimetypes表:

这三个表通常以其协定类的名称命名。这些类定义表所用内容 URI、列名称及列值的常量:

ContactsContract.Contacts

表示不同联系人的行,基于聚合的原始联系人行。

ContactsContract.RawContacts

包含联系人数据摘要的行,针对特定用户帐户和类型。

ContactsContract.Data

包含原始联系人详细信息(例如电子邮件地址或电话号码)的行。

ContactsContract 中的协定类表示的其他表均为辅助表,联系人提供程序利用此类表来管理其操作,或者为设备的联系人或电话应用中的特定功能提供支持。

opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{1f21b26 30690:com.example.day09__androidstudy/u0a193} (pid=30690, uid=10193) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

data1是数据,data2是模式

contentObserver的onchange会执行多次

java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/5 from pid=9943, uid=10194 requires android.permission.READ_SMS, or grantUriPermission()

今日总结:

1.主要学习了ContentPrivider在应用之间封装数据,通过ContentResolver访问数据

2.学习了运行时动态申请权限

ActivityCompat.requestPermissions(activity,permissions,resultCode);

3.学习了用ContentResolver读写联系人

data1 = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DATA1));

4.学习了用ContentObserver监听短信

getContentResolver().registerContentObserver(uri,true,smsGetObserver);

明日计划:

1.学习用相册照片发送彩信

2.学习FileProvider发送彩信

3.学习借助FileProvider安装应用

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值