• 关于 SD卡是什么 的搜索结果

问题

andord下载资源存放可写路径和sd卡路径问题

爵霸 2019-12-01 19:29:14 958 浏览量 回答数 1

回答

连接不上内存卡是什么意思?是说sd卡嘛?有没有什么提示? ------------------------- 外置sd卡目前只能用来当u盘,还无法用来安装应用哦~

cloud_hua 2019-12-02 03:18:37 0 浏览量 回答数 0

回答

需要更多的细节内容,为什么报Launcherdialog错误? 你的软件是关于launcher的吗? android4.4相对于4.0来说视机型,经常存在对sd卡的权限问题,是否会是这儿的权限问题?感谢,你提醒了我,这个错误据说没有安装SD卡的时候也会出现,我去检查下SD卡的读写权限。

爱吃鱼的程序员 2020-06-14 14:54:17 0 浏览量 回答数 0

试用中心

为您提供0门槛上云实践机会,企业用户最高免费12个月

回答

Re小黄蜂 我和8楼问题一样,连接什么都是好的。但是不管下什么东西,它都是在手机内存里。手机内存本来就小就0.01—0.03G,所以只能1-2个东西后就内存满了,我想问怎么样可以吧东西下载SD(TF储存卡里)?因为我卡空间有8G,都是空的。只要是走电脑链接的东西都是直接到手机内存为什么?我手机调试里调的是下载优先SD储存卡,但是还是进手机不进储存卡啊?  我用手机直接无线下载的东西都是在储存卡里,但是安装时候又进手机内存了,所以机子基本是个只能打电话,是个什么都装不了的智能机,请问下怎么样才可以把云空间的东西安装到我的储存卡里啊???

damao123 2019-12-01 23:39:30 0 浏览量 回答数 0

问题

在Android上的哪里保存图片?

LiuWH 2020-01-19 09:23:29 2 浏览量 回答数 1

问题

我在使用C++版的Lucene使用IndexSearcher类的时候遇到崩溃的问题。?报错

爱吃鱼的程序员 2020-06-09 11:21:20 0 浏览量 回答数 1

问题

Hardware-With-A-$10-SD-Card-Reader

福利达人 2019-12-01 21:12:34 362 浏览量 回答数 0

问题

关于读取前4个字节判断文件类型的问题:报错

kun坤 2020-06-06 23:09:43 0 浏览量 回答数 1

问题

关于Android上同样是一张图片,为什么我在浏览器上看是白色的底,我下下来后就变成了黑色的底

爵霸 2019-12-01 20:18:06 907 浏览量 回答数 1

回答

业务场景的具体需求是什么?现在手机都是内置sd卡,选择安装位置没有意义,可能会迷惑用户。即使想实现,需要改系统源码生成ROM,但怎么让用户都使用你的ROM呢?假设一定要做,可以看看PackageManager。

游客uzjwmlwoeww2w 2019-12-02 01:43:51 0 浏览量 回答数 0

回答

我没有读懂你的问题,WIFI SD卡的的差异化竞争力在哪里呢? 多一个远程访问的手段,可能会让这个设备更加的智能化。开发团队后期可以针对这个模块开发更多的功能。蓝牙自从4版本以来,他的功耗是非常低的。(为什么小米手环能够待机一个月仅仅使用很小的电池)。 为什么我的回答没有通过审核

猫咪在云栖 2019-12-01 23:37:56 0 浏览量 回答数 0

问题

设备重启后,app无法自启动,其他有的app却可以这是为什么?

猫饭先生 2019-12-01 21:59:53 891 浏览量 回答数 0

回答

存储介质是什么?U盘/SD卡?还是硬盘?用什么删除的?一般WIN系统删除了,回收站里面找找,回收站清空的或者强制删除的,可以用 DiskGenius,finaldata试试,就是每次扫描需要比较久。注意删除了文件想提高找回来的概率,就尽量不要再往原来的存储里面写入数据。

大头熊熊猪 2019-12-02 01:27:57 0 浏览量 回答数 0

回答

Re阿里云服务器硬盘速度不如SD卡,读取15M写入7.5m每秒 [attachment=51888]硬盘是分布式文件系统,自主开发的,可是写入只有7-10来M每秒,相比硬盘的100-500M每秒,真的是弱爆了,加一个CPU核心要1323元,这价都能买一个I5 cpu了,能用3-5年,而你们这个加的一核CPU还不保证是独享,如此说来,怎么叫扶植和关怀开发者及初创企业? 尊敬的阿里云用户:        您好,感谢您对阿里云产品的长期支持与关注,为了更好的扶植和关怀开发者及初创企业,阿里云计划于2014年4月3日起RDS MySQL类型实例售卖配置及产品价格进行调整,SQL Server价格保持不变。同日,OSS产品价格也进行调整。 最新的产品价格请以RDS和OSS购买页面为准。 http://bbs.aliyun.com/read/155293.html?spm=5176.7189909.0.0.zymbJE ------------------------- Re阿里云服务器硬盘速度不如SD卡,读取15M写入7.5m每秒 测的读400兆?你什么时候远程给我看下吧,只看不控制就行,我试了2台都是这速度,2G内存,1G内存,也有可能是物理机和网络文件夹当硬盘之区别吧 ------------------------- Re阿里云服务器硬盘速度不如SD卡,读取15M写入7.5m每秒 是的,纯命令这不好说的,那有时就直接和VHD的指令勾通了,完全不是真实的去读去写的速度了 ------------------------- 回5楼瀚的some的帖子 空系统我也有100多M,我把系统盘塞满,或者把数据盘全清空,用写入方式,这样来,不管是读是写都在10M以内,太让人不可思议了,阿里技术工程师也是忽悠我来的,这种速度做虚拟机的或做云的,我估计也就阿里最慢了。 我刚写的贴我看下,全面测试了一下 http://bbs.aliyun.com/read/157264.html?spm=0.0.0.0.ZWv5rR ------------------------- Re阿里云服务器硬盘速度不如SD卡,读取15M写入7.5m每秒 分区和减速没有任何关系。系统盘照样可以当数据盘用的,自已做好系统维护工作就行了,不过加个新数据盘也不值多少钱。本身阿里的硬盘速度才10-20M每秒,按你说的,,光系统文件读来读去就差不多了,一秒读10个文件,那硬盘就没什么空的了。要是普通硬盘,100-200M的读写速度,你一个硬盘分10个区都一样快,大部分的人都是单硬盘工作的

服务器插件 2019-12-02 03:08:33 0 浏览量 回答数 0

回答

不同的系统版本以及硬件设备都会有影响的 系统方面,一般android高级版本会比低级版本多一些新的特性,比如在android 6.0中细化了权限的方法,但是在6.0之前这种方法是无法使用的。与此同时,一些方法在低版本系统中是支持的,但是在高版本系统中会被废弃,比如说低版本的tabhost和gallery在高版本中不支持甚至是废弃等。而且,现在国产手机挺多品牌的都会对原有的系统进行阉割改造,会将系统里面的一些方法去掉,或是加入一些方法,反正挺乱的,比如说获取相册的方法啊什么的,在许多的系统中会有不同的获取方法。 硬件设备方面,不同的手机设备一般都不相同,无论屏幕尺寸还是内在的cpu什么的,比如说有的手机又前置摄像头,有的没有(老的手机出现过),再如sd卡也不一定所有的手机都有。 解决方案的话可以多去网上查查资料吧,有时候需要针对某个系统或是机型进行处理的

爵霸 2019-12-02 02:07:31 0 浏览量 回答数 0

回答

不同的系统版本以及硬件设备都会有影响的 系统方面,一般android高级版本会比低级版本多一些新的特性,比如在android 6.0中细化了权限的方法,但是在6.0之前这种方法是无法使用的。与此同时,一些方法在低版本系统中是支持的,但是在高版本系统中会被废弃,比如说低版本的tabhost和gallery在高版本中不支持甚至是废弃等。而且,现在国产手机挺多品牌的都会对原有的系统进行阉割改造,会将系统里面的一些方法去掉,或是加入一些方法,反正挺乱的,比如说获取相册的方法啊什么的,在许多的系统中会有不同的获取方法。 硬件设备方面,不同的手机设备一般都不相同,无论屏幕尺寸还是内在的cpu什么的,比如说有的手机又前置摄像头,有的没有(老的手机出现过),再如sd卡也不一定所有的手机都有。 解决方案的话可以多去网上查查资料吧,有时候需要针对某个系统或是机型进行处理的

爵霸 2019-12-02 02:10:05 0 浏览量 回答数 0

问题

android上在SD卡上建立一个文件夹,为什么打不开??报错

爱吃鱼的程序员 2020-06-22 17:22:49 0 浏览量 回答数 1

问题

怎么才能搞到别人的微信聊天记录,语音能听吗?

调查团队 2019-12-01 19:44:33 1611 浏览量 回答数 2

回答

Re辟谣帖关于最近某人乱喷阿里云的说明 RE:一台对外访问,三台来做备份。 说阿里云cpu内存硬盘贵?你买四套看看价钱如何? 我备份只需要一个移动硬盘,用不着三四份,你们这个是拿部分人的少量要求,把费用强加在每个人头上。为什么要备份三四份?有人说怕地震,怕火灾,这种情况基本上不会发生,却因为可能会发生的事情,叫普通人都交上几百上千元一年的保险费,或许这也就是和强险一个道理了吧。 最起码,你们应该提供无备份,速度是100M-300M读写的硬盘,为了备份3-4份,速度从100-200M减到了10-30M,性能差的离谱了,这真的成了手机SD卡了,我手机SD卡就是这速度,难不成你们把服务器全架设在手机SD卡上吗? ------------------------- Re辟谣帖关于最近某人乱喷阿里云的说明 域名解析也是有即时解析服务的,只不过在部分的域名商,都要设置一个10分钟左右的更新时间。 ------------------------- Re辟谣帖关于最近某人乱喷阿里云的说明 对我来说,备份,一个硬盘就行了,准备2个硬盘,一个挂了,另一个顶上就行了,对一般人来说都足够了,并不是每天有几千几万个图片的增加数据。 ------------------------- Re辟谣帖关于最近某人乱喷阿里云的说明 谣言还是事实,要靠你们主动去做好服务,用过的人都说阿里云速度快,价便便宜,硬盘速度快,宽带便宜,那我就没话说了。确实你们的硬盘速度是真的慢,10-30M每秒的速度,是真实有效的,你们的硬盘确实达不到100-300M,而盛大云之类,西部数据之类,确实有那实力。宽带呢,你们的1M就要这么多钱,这和移动宽带一样,共享是没什么区别的,你们又不是真的拿了1000M宽带2M一个用户的话就只给500个人用,你们这说法,也只不过是保证最低速度有2M,但说白了也就是限制最高速度2M。以往不管是虚拟主机还是服务器,一般都是有20M-100M共享的,服务器资源大那可能就可以得到10M-50M的资源。你们应该做的做法是,尽量的把资源给大家共用。和你们的系统一样,操作系统买下来了可以无限分发,那我们就得到了实惠不用另外几百上千元的授权费用。你们的宽带呢,在人少的时间,基本上一半以上的流量浪费在那里。如果你们也是按多少钱一年交的流量费,那一半也就浪费了。所以我觉的你们有时做法不要太公式化。在保证固有宽带速率的同时,把富余的资源给大家一个弹性的空间。 ------------------------- 回9楼林林林的帖子 真是站着说话不腰疼,我们买多了内存,买多了宽带,你们又不给退。还说“。。。。唉。。这位哥们儿,你用多少买多少不就好了么。。。实在不行还有按量付费。。。比如你举得例子:你只用10g,你偏偏要买100g,偏偏要闲置90g,完了还要骂阿里卖的贵。。。” 有的人确实用了一段时间发现硬盘只要10G就够了,可是当初买了30G,50G,就算你们不肯退不愿承担损失,也该给我们一个交易市场不是,香港现在宽带流量用不完的都可以拿来交易卖给别人的。 新一代的云服务器,不就是用来调剂资源,内存,硬盘,网速最大化合理使用吗?可是人情呢?弹性呢?你们只会弹性计算,咋就不学会弹性宽容人心呢? 有的人本来租你们的云服务器就是创业阶段能省则省,但又没有经验,不知该买多大容量的内存,硬盘。你们应该像是银行在线买基金一样,买之前给大家测验一下,让你明白风险有多大,你自已能承受多大的损失。在我们买下之前,你们应该弄个在线客服,给我们精确一点的计算大约该租多大的硬盘,几核CPU之类,一个原则就是尽可能和帮客户省钱。当然了这不符合你们的商业原则,这样钱就赚的少了。和交易婚介网一样,明明可以仔细审核每一个会员,为了赚钱就不择手段,空号,死号,假资料,全当成是资源,标称几百上千万优质会员。 到了银行,老太婆进去都会叫他买理财产品,却没讲明,这个不是保赚不赔。人家还以为是比存款的利息更高,结果最后赔了钱也没人管。银行呢,一笔业务完成,业务员收入就马上拿到手了,哪会真正的是为客户着想?

服务器插件 2019-12-02 03:13:46 0 浏览量 回答数 0

问题

django服务怎么样才能全部利用cpu资源 400 请求报错 

kun坤 2020-05-30 23:00:18 3 浏览量 回答数 1

回答

sudo apt-get install sysstat 看CPU:  pidstat -p PID 1 看内存: pidstat -r -p PID 1 看磁盘: pidstat -d -p PDI 1 为了方便排查,建议只开一个工作进程. 把SQLite文件放到内存上/dev/shm测试可以排除磁盘的影响. <?php header('Content-Type: text/plain; charset=utf-8'); $file = '/dev/shm/app/data.db3'; $ddl = " BEGIN; CREATE TABLE IF NOT EXISTS queue (     id           INTEGER PRIMARY KEY AUTOINCREMENT,     user_id      INTEGER ); COMMIT; "; if(!file_exists($file)) {     $db = new PDO('sqlite:'.$file);     $db->exec($ddl); } else {     $db = new PDO('sqlite:'.$file); } $user_id = time(); $stmt = $db->prepare('INSERT INTO queue(user_id) VALUES(?)'); $stmt->execute(array($user_id)); echo 'rowCount:'.$stmt->rowCount()."\n"; echo 'lastInsertId:'.$db->lastInsertId()."\n"; $stmt = $db->query('SELECT * FROM queue WHERE id = '.$db->lastInsertId()); var_export($stmt->fetchAll(PDO::FETCH_ASSOC)); // sudo mkdir -m 777 /dev/shm/app // php -S 127.0.0.1:8080 -t /www >/dev/null 2>&1 & // ab -c100 -n5000 http://127.0.0.1:8080/ // ab -c100 -n500   http://127.0.0.1:8080/ Ubuntu(i5-3230M)上RPS达到2660,而树莓派(BCM2709)上只有185(如果SQLite不在内存上而在SD卡上RPS会降到30).同样的逻辑,在SD卡上比内存/dev/shm上慢了6倍,这时就是磁盘I/O读写的瓶颈.跟i5-3230M比,BCM2709慢了十几倍,这时就是CPU的性能瓶颈了. ######回复 @eechen : 不是什么东西都能粗略的呀,你这代码,真要拿来用的时候,那多出来的数据会加入你后续排序和计算欧几里得距离的过程,影响性能的呀。而且这种影响是毫无意义的浪费,要是写php都像你这么浪费,谁还敢用php. --via 张亦俊######怎么感觉整个osc都把你当猴看,做猴耍一样,哈哈[79] via 金三胖######回复 @Fover : 树莓派跑python还带框架,会比较慢######@乌龟壳 嗯,我知道,只是现在在学习阶段,用树莓派来试试。######@Fover######用gunicorn -w 4,四核四个进程,理论上能用所有的核了。至于为什么不能用100%,可能哪里出现瓶颈了,比如io,或django本身就比较慢;我觉得arm的cpu性能比较慢,可能不上gevent还快点,可以试试不用gevent,只用gunicorn试试,或换一个wsgi服务器,比如bjoern试试######bjoern 晚上回去试试。昨天最后替换了gevent改为meinheld 性能有所提升,但是幅度并不大,晚上回去试试eechen的方法,将数据库挂载到内存中看看。######并不是CPU占用最大,性能才最高啊。######因为cpu利用率只有50%左右,所以我认为还有提升空间的。

kun坤 2020-05-31 13:06:54 0 浏览量 回答数 0

回答

Isisadirectory!!!!!!!!!!!!!!!!你要保存成图片就要给图片命名!!!回复<aclass='referer'target='_blank'>@决定的温度:open的时候没有这个文件回复<aclass='referer'target='_blank'>@Mr_Zhou:额,Mr_zhou,又错了。为什么我在虚拟机上面可以运行,把程序放到真机上调试就显示java.io.FileNotExecption:/mnt/sdcard/image/tupian.png:openfailed:EACCES(Permissiondenied),这个是我SD卡问题吗。。回复<aclass='referer'target='_blank'>@决定的温度:保存的时候加上文件名就行了撒至于怎么命名就看你自己了撒回复<aclass='referer'target='_blank'>@Mr_Zhou:反正比我强。。。我现在有个问题。我现在想吧http://w250080.s124-220.myverydz.com/discuz/static/space/t2/images/这个文件下的所有图片都下载下来,这个在保存的时候应该怎么做啊?。。回复<aclass='referer'target='_blank'>@决定的温度:额......我不是大神我是菜鸟。。但是看错误信息还是比较在行。。。下载图片是要保存到image文件夹下的某一文件中,但是看你的过程没有指定文件名,没有写入数据的目标对象啊

爱吃鱼的程序员 2020-06-22 17:23:05 0 浏览量 回答数 0

问题

关于测试阿里云的DD/磁盘IO的朋友进来下

enj0y 2019-12-01 20:21:13 23838 浏览量 回答数 22

问题

Android数据库框架-Archiver(LiteOrm)的使用?报错

爱吃鱼的程序员 2020-06-12 14:43:40 2 浏览量 回答数 1

回答

Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等 核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data/<package name>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下: Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。 Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。 Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写 Editor有如下主要重要方法: SharedPreferences.Editor clear():清空SharedPreferences里所有数据 SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key对应的数据,其中xxx 可以是boolean,float,int等各种基本类型据 SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项 boolean commit(): 当Editor编辑完成后,使用该方法提交修改 实际案例:运行界面如下 这里只提供了两个按钮和一个输入文本框,布局简单,故在此不给出界面布局文件了,程序核心代码如下: 、class ViewOcl implements View.OnClickListener{ @Override public void onClick(View v) { switch(v.getId()){ case R.id.btnSet: //步骤1:获取输入值 String code = txtCode.getText().toString().trim(); //步骤2-1:创建一个SharedPreferences.Editor接口对象,lock表示要写入的XML文件名,MODE_WORLD_WRITEABLE写操作 SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit(); //步骤2-2:将获取过来的值放入文件 editor.putString("code", code); //步骤3:提交 editor.commit(); Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show(); break; case R.id.btnGet: //步骤1:创建一个SharedPreferences接口对象 SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE); //步骤2:获取文件中的值 String value = read.getString("code", ""); Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show(); break; } } } 、读写其他应用的SharedPreferences: 步骤如下 1、在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取 2、创建其他应用程序对应的Context: Context pvCount = createPackageContext("com.tony.app", Context.CONTEXT_IGNORE_SECURITY);这里的com.tony.app就是其他程序的包名 3、使用其他程序的Context获取对应的SharedPreferences SharedPreferences read = pvCount.getSharedPreferences("lock", Context.MODE_WORLD_READABLE); 4、如果是写入数据,使用Editor接口即可,所有其他操作均和前面一致。 SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。 第二种: 文件存储数据 核心原理: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。具体有以下值可选: MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可 以使用Context.MODE_APPEND MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。 除此之外,Context还提供了如下几个重要的方法: getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录 File getFilesDir():获取该应用程序的数据文件夹得绝对路径 String[] fileList():返回该应用数据文件夹的全部文件 public String read() { try { FileInputStream inStream = this.openFileInput("message.txt"); byte[] buffer = new byte[1024]; int hasRead = 0; StringBuilder sb = new StringBuilder(); while ((hasRead = inStream.read(buffer)) != -1) { sb.append(new String(buffer, 0, hasRead)); } inStream.close(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } public void write(String msg){ // 步骤1:获取输入值 if(msg == null) return; try { // 步骤2:创建一个FileOutputStream对象,MODE_APPEND追加模式 FileOutputStream fos = openFileOutput("message.txt", MODE_APPEND); // 步骤3:将获取过来的值放入文件 fos.write(msg.getBytes()); // 步骤4:关闭数据流 fos.close(); } catch (Exception e) { e.printStackTrace(); } } openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data//files目录,如: /data/data/cn.tony.app/files/message.txt, 下面讲解某些特殊文件读写需要注意的地方: 读写sdcard上的文件 其中读写步骤按如下进行: 1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 2、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录 3、使用IO流操作SD卡上的文件 注意点:手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡 必须在AndroidManifest.xml上配置读写SD卡的权限 // 文件写操作函数 private void write(String content) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定义File类对象 if (!file.getParentFile().exists()) { // 父文件夹不存在 file.getParentFile().mkdirs(); // 创建文件夹 } PrintStream out = null; // 打印流对象用于输出 try { out = new PrintStream(new FileOutputStream(file, true)); // 追加文件 out.println(content); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { out.close(); // 关闭打印流 } } } else { // SDCard不存在,使用Toast提示用户 Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show(); } } // 文件读操作函数 private String read() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 如果sdcard存在 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + DIR + File.separator + FILENAME); // 定义File类对象 if (!file.getParentFile().exists()) { // 父文件夹不存在 file.getParentFile().mkdirs(); // 创建文件夹 } Scanner scan = null; // 扫描输入 StringBuilder sb = new StringBuilder(); try { scan = new Scanner(new FileInputStream(file)); // 实例化Scanner while (scan.hasNext()) { // 循环读取 sb.append(scan.next() + "\n"); // 设置文本 } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { if (scan != null) { scan.close(); // 关闭打印流 } } } else { // SDCard不存在,使用Toast提示用户 Toast.makeText(this, "读取失败,SD卡不存在!", Toast.LENGTH_LONG).show(); } return null; } 复制代码 第三种:SQLite存储数据 SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧 SQLiteDatabase类为我们提供了很多种方法,上面的代码中基本上囊括了大部分的数据库操作;对于添加、更新和删除来说,我们都可以使用 1 db.executeSQL(String sql); 2 db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集 除了统一的形式之外,他们还有各自的操作方法: 1 db.insert(String table, String nullColumnHack, ContentValues values); 2 db.update(String table, Contentvalues values, String whereClause, String whereArgs); 3 db.delete(String table, String whereClause, String whereArgs);以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样 下面给出demo 数据的添加 1.使用insert方法 复制代码1 ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据2 cv.put("title","you are beautiful");//添加title3 cv.put("weather","sun"); //添加weather4 cv.put("context","xxxx"); //添加context5 String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")6 .format(new Date());7 cv.put("publish ",publish); //添加publish8 db.insert("diary",null,cv);//执行插入操作复制代码2.使用execSQL方式来实现 String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句db.execSQL(sql);//执行SQL语句数据的删除 同样有2种方式可以实现 String whereClause = "username=?";//删除的条件String[] whereArgs = {"Jack Johnson"};//删除的条件参数db.delete("user",whereClause,whereArgs);//执行删除使用execSQL方式的实现 String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句db.execSQL(sql);//执行删除操作数据修改 同上,仍是2种方式 ContentValues cv = new ContentValues();//实例化ContentValuescv.put("password","iHatePopMusic");//添加要更改的字段及内容String whereClause = "username=?";//修改条件String[] whereArgs = {"Jack Johnson"};//修改条件的参数db.update("user",cv,whereClause,whereArgs);//执行修改使用execSQL方式的实现 String sql = "update user set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL语句db.execSQL(sql);//执行修改数据查询 下面来说说查询操作。查询操作相对于上面的几种操作要复杂些,因为我们经常要面对着各种各样的查询条件,所以系统也考虑到这种复杂性,为我们提供了较为丰富的查询形式: 1 db.rawQuery(String sql, String[] selectionArgs); 2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集; 各参数说明: table:表名称colums:表示要查询的列所有名称集selection:表示WHERE之后的条件语句,可以使用占位符selectionArgs:条件语句的参数数组groupBy:指定分组的列名having:指定分组条件,配合groupBy使用orderBy:y指定排序的列名limit:指定分页参数distinct:指定“true”或“false”表示要不要过滤重复值Cursor:返回值,相当于结果集ResultSet最后,他们同时返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。下面是Cursor对象的常用方法: 复制代码 1 c.move(int offset); //以当前位置为参考,移动到指定行 2 c.moveToFirst(); //移动到第一行 3 c.moveToLast(); //移动到最后一行 4 c.moveToPosition(int position); //移动到指定行 5 c.moveToPrevious(); //移动到前一行 6 c.moveToNext(); //移动到下一行 7 c.isFirst(); //是否指向第一条 8 c.isLast(); //是否指向最后一条 9 c.isBeforeFirst(); //是否指向第一条之前 10 c.isAfterLast(); //是否指向最后一条之后 11 c.isNull(int columnIndex); //指定列是否为空(列基数为0) 12 c.isClosed(); //游标是否已关闭 13 c.getCount(); //总数据项数 14 c.getPosition(); //返回当前游标所指向的行数 15 c.getColumnIndex(String columnName);//返回某列名对应的列索引值 16 c.getString(int columnIndex); //返回当前行指定列的值 复制代码实现代码 复制代码String[] params = {12345,123456};Cursor cursor = db.query("user",columns,"ID=?",params,null,null,null);//查询并获得游标if(cursor.moveToFirst()){//判断游标是否为空 for(int i=0;i<cursor.getCount();i++){ cursor.move(i);//移动到指定记录 String username = cursor.getString(cursor.getColumnIndex("username"); String password = cursor.getString(cursor.getColumnIndex("password")); } }复制代码通过rawQuery实现的带参数查询 复制代码Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable");//Cursor c = db.rawQuery("s name, inventory FROM mytable where ID=?",new Stirng[]{"123456"}); result.moveToFirst(); while (!result.isAfterLast()) { int id=result.getInt(0); String name=result.getString(1); int inventory=result.getInt(2); // do something useful with these result.moveToNext(); } result.close();复制代码 在上面的代码示例中,已经用到了这几个常用方法中的一些,关于更多的信息,大家可以参考官方文档中的说明。 最后当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。 上面就是SQLite的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。 这里直接使用案例讲解:下面是案例demo的界面 SQLiteOpenHelper类介绍 SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。 方法名 方法描述SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) 构造方法,其中 context 程序上下文环境 即:XXXActivity.this; name :数据库名字; factory:游标工厂,默认为null,即为使用默认工厂; version 数据库版本号 onCreate(SQLiteDatabase db) 创建数据库时调用onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新时调用getReadableDatabase() 创建或打开一个只读数据库getWritableDatabase() 创建或打开一个读写数据库首先创建数据库类 复制代码 1 import android.content.Context; 2 import android.database.sqlite.SQLiteDatabase; 3 import android.database.sqlite.SQLiteDatabase.CursorFactory; 4 import android.database.sqlite.SQLiteOpenHelper; 5 6 public class SqliteDBHelper extends SQLiteOpenHelper { 7 8 // 步骤1:设置常数参量 9 private static final String DATABASE_NAME = "diary_db";10 private static final int VERSION = 1;11 private static final String TABLE_NAME = "diary";12 13 // 步骤2:重载构造方法14 public SqliteDBHelper(Context context) {15 super(context, DATABASE_NAME, null, VERSION);16 }17 18 /*19 * 参数介绍:context 程序上下文环境 即:XXXActivity.this 20 * name 数据库名字 21 * factory 接收数据,一般情况为null22 * version 数据库版本号23 */24 public SqliteDBHelper(Context context, String name, CursorFactory factory,25 int version) {26 super(context, name, factory, version);27 }28 //数据库第一次被创建时,onCreate()会被调用29 @Override30 public void onCreate(SQLiteDatabase db) {31 // 步骤3:数据库表的创建32 String strSQL = "create table "33 + TABLE_NAME34 + "(tid integer primary key autoincrement,title varchar(20),weather varchar(10),context text,publish date)";35 //步骤4:使用参数db,创建对象36 db.execSQL(strSQL);37 }38 //数据库版本变化时,会调用onUpgrade()39 @Override40 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {41 42 }43 }复制代码正如上面所述,数据库第一次创建时onCreate方法会被调用,我们可以执行创建表的语句,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。 我们需要一个Dao,来封装我们所有的业务方法,代码如下: 复制代码 1 import android.content.Context; 2 import android.database.Cursor; 3 import android.database.sqlite.SQLiteDatabase; 4 5 import com.chinasoft.dbhelper.SqliteDBHelper; 6 7 public class DiaryDao { 8 9 private SqliteDBHelper sqliteDBHelper;10 private SQLiteDatabase db;11 12 // 重写构造方法13 public DiaryDao(Context context) {14 this.sqliteDBHelper = new SqliteDBHelper(context);15 db = sqliteDBHelper.getWritableDatabase();16 }17 18 // 读操作19 public String execQuery(final String strSQL) {20 try {21 System.out.println("strSQL>" + strSQL);22 // Cursor相当于JDBC中的ResultSet23 Cursor cursor = db.rawQuery(strSQL, null);24 // 始终让cursor指向数据库表的第1行记录25 cursor.moveToFirst();26 // 定义一个StringBuffer的对象,用于动态拼接字符串27 StringBuffer sb = new StringBuffer();28 // 循环游标,如果不是最后一项记录29 while (!cursor.isAfterLast()) {30 sb.append(cursor.getInt(0) + "/" + cursor.getString(1) + "/"31 + cursor.getString(2) + "/" + cursor.getString(3) + "/"32 + cursor.getString(4)+"#");33 //cursor游标移动34 cursor.moveToNext();35 }36 db.close();37 return sb.deleteCharAt(sb.length()-1).toString();38 } catch (RuntimeException e) {39 e.printStackTrace();40 return null;41 }42 43 }44 45 // 写操作46 public boolean execOther(final String strSQL) {47 db.beginTransaction(); //开始事务48 try {49 System.out.println("strSQL" + strSQL);50 db.execSQL(strSQL);51 db.setTransactionSuccessful(); //设置事务成功完成 52 db.close();53 return true;54 } catch (RuntimeException e) {55 e.printStackTrace();56 return false;57 }finally { 58 db.endTransaction(); //结束事务 59 } 60 61 }62 }复制代码我们在Dao构造方法中实例化sqliteDBHelper并获取一个SQLiteDatabase对象,作为整个应用的数据库实例;在增删改信息时,我们采用了事务处理,确保数据完整性;最后要注意释放数据库资源db.close(),这一个步骤在我们整个应用关闭时执行,这个环节容易被忘记,所以朋友们要注意。 我们获取数据库实例时使用了getWritableDatabase()方法,也许朋友们会有疑问,在getWritableDatabase()和getReadableDatabase()中,你为什么选择前者作为整个应用的数据库实例呢?在这里我想和大家着重分析一下这一点。 我们来看一下SQLiteOpenHelper中的getReadableDatabase()方法: 复制代码 1 public synchronized SQLiteDatabase getReadableDatabase() { 2 if (mDatabase != null && mDatabase.isOpen()) { 3 // 如果发现mDatabase不为空并且已经打开则直接返回 4 return mDatabase; 5 } 6 7 if (mIsInitializing) { 8 // 如果正在初始化则抛出异常 9 throw new IllegalStateException("getReadableDatabase called recursively"); 10 } 11 12 // 开始实例化数据库mDatabase 13 14 try { 15 // 注意这里是调用了getWritableDatabase()方法 16 return getWritableDatabase(); 17 } catch (SQLiteException e) { 18 if (mName == null) 19 throw e; // Can't open a temp database read-only! 20 Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e); 21 } 22 23 // 如果无法以可读写模式打开数据库 则以只读方式打开 24 25 SQLiteDatabase db = null; 26 try { 27 mIsInitializing = true; 28 String path = mContext.getDatabasePath(mName).getPath();// 获取数据库路径 29 // 以只读方式打开数据库 30 db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY); 31 if (db.getVersion() != mNewVersion) { 32 throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " 33 + mNewVersion + ": " + path); 34 } 35 36 onOpen(db); 37 Log.w(TAG, "Opened " + mName + " in read-only mode"); 38 mDatabase = db;// 为mDatabase指定新打开的数据库 39 return mDatabase;// 返回打开的数据库 40 } finally { 41 mIsInitializing = false; 42 if (db != null && db != mDatabase) 43 db.close(); 44 } 45 }复制代码在getReadableDatabase()方法中,首先判断是否已存在数据库实例并且是打开状态,如果是,则直接返回该实例,否则试图获取一个可读写模式的数据库实例,如果遇到磁盘空间已满等情况获取失败的话,再以只读模式打开数据库,获取数据库实例并返回,然后为mDatabase赋值为最新打开的数据库实例。既然有可能调用到getWritableDatabase()方法,我们就要看一下了: 复制代码public synchronized SQLiteDatabase getWritableDatabase() { if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { // 如果mDatabase不为空已打开并且不是只读模式 则返回该实例 return mDatabase; } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would // fail waiting for the file lock. To prevent that, we acquire the // lock on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; // 如果mDatabase不为空则加锁 阻止其他的操作 if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mName == null) { db = SQLiteDatabase.create(null); } else { // 打开或创建数据库 db = mContext.openOrCreateDatabase(mName, 0, mFactory); } // 获取数据库版本(如果刚创建的数据库,版本为0) int version = db.getVersion(); // 比较版本(我们代码中的版本mNewVersion为1) if (version != mNewVersion) { db.beginTransaction();// 开始事务 try { if (version == 0) { // 执行我们的onCreate方法 onCreate(db); } else { // 如果我们应用升级了mNewVersion为2,而原版本为1则执行onUpgrade方法 onUpgrade(db, version, mNewVersion); } db.setVersion(mNewVersion);// 设置最新版本 db.setTransactionSuccessful();// 设置事务成功 } finally { db.endTransaction();// 结束事务 } } onOpen(db); success = true; return db;// 返回可读写模式的数据库实例 } finally { mIsInitializing = false; if (success) { // 打开成功 if (mDatabase != null) { // 如果mDatabase有值则先关闭 try { mDatabase.close(); } catch (Exception e) { } mDatabase.unlock();// 解锁 } mDatabase = db;// 赋值给mDatabase } else { // 打开失败的情况:解锁、关闭 if (mDatabase != null) mDatabase.unlock(); if (db != null) db.close(); } } }复制代码大家可以看到,几个关键步骤是,首先判断mDatabase如果不为空已打开并不是只读模式则直接返回,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,比较版本,根据版本号来调用相应的方法,为数据库设置新版本号,最后释放旧的不为空的mDatabase并解锁,把新打开的数据库实例赋予mDatabase,并返回最新实例。 看完上面的过程之后,大家或许就清楚了许多,如果不是在遇到磁盘空间已满等情况,getReadableDatabase()一般都会返回和getWritableDatabase()一样的数据库实例,所以我们在DBManager构造方法中使用getWritableDatabase()获取整个应用所使用的数据库实例是可行的。当然如果你真的担心这种情况会发生,那么你可以先用getWritableDatabase()获取数据实例,如果遇到异常,再试图用getReadableDatabase()获取实例,当然这个时候你获取的实例只能读不能写了 最后,让我们看一下如何使用这些数据操作方法来显示数据,界面核心逻辑代码: 复制代码public class SQLiteActivity extends Activity { public DiaryDao diaryDao; //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory); //所以要确保context已初始化,我们可以把实例化Dao的步骤放在Activity的onCreate里 @Override protected void onCreate(Bundle savedInstanceState) { diaryDao = new DiaryDao(SQLiteActivity.this); initDatabase(); } class ViewOcl implements View.OnClickListener { @Override public void onClick(View v) { String strSQL; boolean flag; String message; switch (v.getId()) { case R.id.btnAdd: String title = txtTitle.getText().toString().trim(); String weather = txtWeather.getText().toString().trim();; String context = txtContext.getText().toString().trim();; String publish = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(new Date()); // 动态组件SQL语句 strSQL = "insert into diary values(null,'" + title + "','" + weather + "','" + context + "','" + publish + "')"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"添加成功":"添加失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; case R.id.btnDelete: strSQL = "delete from diary where tid = 1"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"删除成功":"删除失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; case R.id.btnQuery: strSQL = "select * from diary order by publish desc"; String data = diaryDao.execQuery(strSQL); Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG).show(); break; case R.id.btnUpdate: strSQL = "update diary set title = '测试标题1-1' where tid = 1"; flag = diaryDao.execOther(strSQL); //返回信息 message = flag?"更新成功":"更新失败"; Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); break; } } } private void initDatabase() { // 创建数据库对象 SqliteDBHelper sqliteDBHelper = new SqliteDBHelper(SQLiteActivity.this); sqliteDBHelper.getWritableDatabase(); System.out.println("数据库创建成功"); } }复制代码 Android sqlite3数据库管理工具 Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具。开发者可以方便的使用其对sqlite数据库进行命令行的操作。 程序运行生成的.db文件一般位于"/data/data/项目名(包括所处包名)/databases/.db",因此要对数据库文件进行操作需要先找到数据库文件: 1、进入shell 命令 adb shell2、找到数据库文件 cd data/data ls --列出所有项目 cd project_name --进入所需项目名 cd databases ls --列出现寸的数据库文件 3、进入数据库 sqlite3 test_db --进入所需数据库 会出现类似如下字样: SQLite version 3.6.22Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite>至此,可对数据库进行sql操作。 4、sqlite常用命令 .databases --产看当前数据库.tables --查看当前数据库中的表.help --sqlite3帮助.schema --各个表的生成语句 原文地址https://www.cnblogs.com/ITtangtang/p/3920916.html

auto_answer 2019-12-02 01:50:21 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播