androidsqlite数据库怎么查询sqlite中的数据

当前访客身份:游客 [
当前位置:
新手入门欠缺了某些知识点。
我用DDMS也看不到所谓的数据库文件,手机连接到电脑上在“内存设备”里面也找不到数据库文件,搜索关键字也找不到。
共有3个答案
<span class="a_vote_num" id="a_vote_num_
没root的话,真机是看不了的!root后,/data/data/xxxx(包名)/database下有数据库文件。
<span class="a_vote_num" id="a_vote_num_
可能是你没有手机应用目录的访问权限吧,可以用adb shell进入,然后su再用ls查看,应用的数据库或其他文件一般是在/data/data目录下
<span class="a_vote_num" id="a_vote_num_
context.getDatabasePath(name)可以获取数据库文件路径,访问需要权限。你可以在代码中将数据库文件复制到sdcard下。
更多开发者职位上
有什么技术问题吗?
bibisho...的其它问题
类似的话题Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android中的SQL查询语句LIKE绑定参数问题解决办法,本文使用的是sqlite数据库,需要的朋友可以参考下
由于考虑到数据库的安全性,不被轻易SQL注入,执行查询语句时,一般不使用直接拼接的语句,而是使用参数传递的方法。然后在使用参数传递的方法中时,发现当使用like方式查询数据时,很容易出现一个问题。
错误案例:
代码如下:String myname = "abc";String sql = "select * from mytable where name like '?%'";Cursor cursor = db.rawQuery(sql, new String[]{myname};运行提示如下错误: 代码如下:java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range. The statement has 0 parameters.
根据错误提示可知,sql语句中的?号没有被识别出来,从而new String[]{myname}没法替代sql中的?号。?号没有被识别出来的原因估计是?号外有单引号,但是在sql中like语句的值和%号需要用引号围着。
为了解决sql中?号无法识别,必须去掉?号外的引号,那么%号也需要去掉。所以,得在后面代替?号的参数中添加上%号。
所以,正确的案例如下: 代码如下:String myname = "abc";String sql = "select * from mytable where name like ?";Cursor cursor = db.rawQuery(sql, new String[]{myname+"%"};可能有人会问为什么不用添加引号,因为参数代替?号时,自动以字符串的形式代替的。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具在android中从sqlite中获得数据很慢怎么解决
我的代码是:DatabaseHandler db = new DatabaseHandler(this);
System.out.println("Start - " + System.currentTimeMillis());
for (int i = 1; i & db.getChampsCount() + 1; i++) {
String name = db.getChampInfo(i, "name");
String title = db.getChampInfo(i, "title");
String thumb = db.getChampInfo(i, "thumb");
System.out.println("End - " + System.currentTimeMillis());
}和这个String getChampInfo(int id, String col) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT " + col + " FROM champions WHERE id = " + id, new String[] {});
if (cursor != null)
cursor.moveToFirst();
db.close();
return cursor.getString(0);
}这是DatabaseHelper类的一部分这个运行没有问题,但是问题是它执行起来时间很长(在我的android机子上是2089ms)。这些字符串是UI的一部分,所以我不认为我能把他放到另外一个线程中。如果要让这段代码跑的快一点,我应该怎么做?确切的说是110行
解决方法 1:
不应该是用单独的语句,你不应该用单独的sql语句?只是创建一个ArrayList,在这个activity类中存储所有需要的数值。例如:&ArrayList&myD现在在数据库类的帮助下写一个function,就像下边://得到你想要的数据
public ArrayList&String& getAllData() {
ArrayList&String& subTitleList =
Cursor cursor =
String queryString = "SELECT * FROM champions";
db.rawQuery(queryString, null);
if (cursor != null && cursor.moveToFirst()) {
subTitleList = new ArrayList&String&();
String nextUser = new String(cursor.getString(cursor.getColumnIndex("name")));
String nextUser = new String(cursor.getString(cursor.getColumnIndex("title")));
String nextUser = new String(cursor.getString(cursor.getColumnIndex("thumb")));
subTitleList.add(nextUser);
while (cursor.moveToNext());
System.out.println("it comes in SubTitleList");
catch (Exception e) {
e.printStackTrace();
subTitleList =
if (cursor != null && !cursor.isClosed()) {
cursor.deactivate();
cursor.close();
if(db != null){
db.close();
//System.out.println("SubTitleList is: "+subTitleList);
return subTitleL
}现在在你的activity类中你可以调用这个方法,然后从myData&ArrayList获得所有你需要的数据。myData = db.getAllData(); // 我想如果你想要抓所有的数据的话是不需要ID的。希望你能明白2013年10月
2930123456712131920262728123456789
随笔 - 3936
文章 - 404
评论 - 159
留言簿(50)
阅读排行榜
评论排行榜安卓 SQLite数据库操作实例
- 小敏的博客 - ITeye技术网站
前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。
在Android 运行时环境包含了完整的 SQLite。
首先介绍一下SQLite这个数据库:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
有一点相对其他数据库来说比较特殊的是:SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,意思就是说话你可以在创建数据库表的时候任意定义数据类型,却不影响实际使用时的数据存储。
举个例子说就是你可以在创建表时定义username字段为varchar类型,但是实时使用时你可以向这个字段存入1、2.5、.。。这样的整型,单精,以及时间等其他类型,在SQLite里没有这种限制。
但是有一种情况例外:当字段类型为
”Integer Primary Key” 时,就是定义表主键,这个就只能是integer类型。和普通数据库相同 。
SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
需要注意一点: SQLite不支持存储过程!
我这里就简单介绍,如需要可自行去了解关于SQLite的更多知识,
然后是我的Demo(一个简单的完成数据库增删查改操作):
首先是项目目录结构:
在本项目中我们使用JUnit测试,就要在AndroidManifest.xml配置JUnit
AndroidManifest.xml
&manifest xmlns:android="/apk/res/android"
package="org.yzsoft.sqlitedemo.test"
android:versionCode="1"
android:versionName="1.0" &
&!-- 为了方便测试,我直接把上面包位置改成我项目的测试包下 --&
android:minSdkVersion="8"
android:targetSdkVersion="15" /&
&application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" &
因为我们开发项目的时候,包会比较多,所以最好在下面这个activity的配置(
android:name="org.yzsoft.sqlitedemo.activity.MainActivity" )这句这里打上完整的
,虽然可以直接用
.类名,但是这个.类名是建立在
&manifest xmlns:android="/apk/res/android"
package="org.yzsoft.sqlitedemo.test"
之上的,用package+.类名也刚好可以组合成完整路径。但是我们保险一点写完整去。
android:name="org.yzsoft.sqlitedemo.activity.MainActivity"
android:label="@string/title_activity_main" &
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
&!-- JUnit要加这句 --&
&uses-library android:name="android.test.runner" /&
&/application&
&!-- JUnit还要加这段 (android:targetPackage测试类所在包名 ) --&
&instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="Test Unit Tests"
android:targetPackage="org.yzsoft.sqlitedemo.test" &
&/instrumentation&
&/manifest&
1、MainActivity.java(因为本项目中使用JUnit进行测试,就不需要Activity了,留着不用写它)
package org.yzsoft.sqlitedemo.
import org.yzsoft.sqlitedemo.util.R;
import org.yzsoft.sqlitedemo.util.R.
import org.yzsoft.sqlitedemo.util.R.
import android.os.B
import android.app.A
import android.view.M
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
2、DBOpenHandler.java
package org.yzsoft.sqlitedemo.
import android.content.C
import android.database.sqlite.SQLiteD
import android.database.sqlite.SQLiteDatabase.CursorF
import android.database.sqlite.SQLiteOpenH
public class DBOpenHandler extends SQLiteOpenHelper {
* @param context
* @param name
* @param factory
可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。
* @param version
数据库版本号
public DBOpenHandler(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
public void onCreate(SQLiteDatabase db) {// 覆写onCreate方法,当数据库创建时就用SQL命令创建一个表
// 创建一个t_users表,id主键,自动增长,字符类型的username和
db.execSQL("create table t_users(id integer primary key autoincrement,username varchar(200),pass varchar(200) )");
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
3、TUsers.java(实体类,习惯了WEB开发,总会加个实体类,方便)
package org.yzsoft.sqlitedemo.
public class TUsers {
public int getId() {
public void setId(int id) {
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPass() {
public void setPass(String pass) {
this.pass =
4、SQLiteDAOImpl.java(数据库操作实现类)
package org.yzsoft.sqlitedemo.
import java.util.ArrayL
import java.util.L
import org.yzsoft.sqlitedemo.vo.TU
import android.content.C
import android.database.C
import android.database.sqlite.SQLiteD
public class SQLiteDAOImpl {
private DBOpenHandler dbOpenH
public SQLiteDAOImpl(Context context) {
this.dbOpenHandler = new DBOpenHandler(context, "dbtest.db", null, 1);
public void save(TUsers tusers) {// 插入记录
SQLiteDatabase db = dbOpenHandler.getWritableDatabase();// 取得数据库操作
db.execSQL("insert into t_users (username,pass) values(?,?)", new Object[] { tusers.getUsername(), tusers.getPass() });
db.close();// 记得关闭数据库操作
public void delete(Integer id) {// 删除纪录
SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
db.execSQL("delete from t_users where id=?", new Object[] { id.toString() });
db.close();
public void update(TUsers tusers) {// 修改纪录
SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
db.execSQL("update t_users set username=?,pass=? where" + " id=?", new Object[] { tusers.getUsername(), tusers.getPass(), tusers.getId() });
db.close();
public TUsers find(Integer id) {// 根据ID查找纪录
TUsers tusers =
SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
// 用游标Cursor接收从数据库检索到的数据
Cursor cursor = db.rawQuery("select * from t_users where id=?", new String[] { id.toString() });
if (cursor.moveToFirst()) {// 依次取出数据
tusers = new TUsers();
tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
db.close();
public List&TUsers& findAll() {// 查询所有记录
List&TUsers& lists = new ArrayList&TUsers&();
TUsers tusers =
SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
// Cursor cursor=db.rawQuery("select * from t_users limit ?,?", new
// String[]{offset.toString(),maxLength.toString()});
// //这里支持类型MYSQL的limit分页操作
Cursor cursor = db.rawQuery("select * from t_users ", null);
while (cursor.moveToNext()) {
tusers = new TUsers();
tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
lists.add(tusers);
db.close();
public long getCount() {//统计所有记录数
SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
Cursor cursor = db.rawQuery("select count(*) from t_users ", null);
cursor.moveToFirst();
db.close();
return cursor.getLong(0);
5、TUsersTest.java(JUnit测试类)
package org.yzsoft.sqlitedemo.
import java.util.L
import org.yzsoft.sqlitedemo.util.DBOpenH
import org.yzsoft.sqlitedemo.util.SQLiteDAOI
import org.yzsoft.sqlitedemo.vo.TU
import android.test.AndroidTestC
import android.util.L
public class TUsersTest extends AndroidTestCase {
private static final String TAG = "这个是测试类";// 准备好TAG标识用于LOG输出,方便我们用LogCat进行调试
public void testCreate() {
DBOpenHandler dbHandler = new DBOpenHandler(this.getContext(), "dbtest.db", null, 1);// 创建数据库文件
dbHandler.getWritableDatabase();
public void testSave() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
TUsers tuser = new TUsers();
tuser.setUsername("用户");
tuser.setPass("密码");
p.save(tuser);
Log.i(TAG, "插入成功");// 用日志记录一个我们自定义的输出。可以在LogCat窗口中查看,方便调试
public void testUpate() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
TUsers tuser = p.find(1);
tuser.setUsername("张三");
p.update(tuser);
Log.i(TAG, "修改成功");
public void testDelete() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
p.delete(2);
Log.i(TAG, "删除成功");
public void testFind() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
TUsers tuser = p.find(1);
Log.i(TAG, tuser.getUsername() + "
public void testGetCount() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
Log.i(TAG, p.getCount() + "
总记录数");
public void testFindAll() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
List&TUsers& tusers = p.findAll();
for (TUsers tuser : tusers) {
Log.i(TAG, tuser.getUsername() + "
然后是测试中的一些截图:
最后我们把File Exploer中data/data/项目包名/databases/dbtest.db 导出来,用Navicat Premium等数据库管理工具查看里面的数据:
导出来看看:
虽然安卓平台中SQLite是个小型的本地数据库,但是有些地方使用起来会比文件存储更方便,本文只是对它作一个简单的操作实例 ,有这方面兴趣的童鞋可以自己去深入研究。也希望大家能多交流交流~~~~
最最后~附上项目源码:
(675.4 KB)
下载次数: 146
浏览: 68984 次
来自: 广西
TUsersTest.java(JUnit测试类)怎么调用啊? ...
你好,用这个DEMO启动就报错呀
[ERROR] [local ...
大侠你好,求整个项目的源码,谢谢。zhl_.c ...

我要回帖

更多关于 sqlite查询数据 的文章

 

随机推荐