需要帮助从 SQLite 数据库中获取数据
Posted
技术标签:
【中文标题】需要帮助从 SQLite 数据库中获取数据【英文标题】:Need help getting data out of SQLite database 【发布时间】:2011-03-31 21:03:05 【问题描述】:我正在创建一个应用程序,可以在谷歌地图上显示某些咖啡馆的位置。我希望我的应用从数据库中获取咖啡馆的经度和纬度,并使用它们在我的地图上设置标记。
我已经阅读了很多关于如何使用 SQLite 的教程,但我只设法打开了我的数据库,但没有检索任何内容。我试过使用游标等,但不断出错。我相信这是因为缺乏知识。我浏览了这个网站,找不到任何对我有用的东西。多亏了本教程,我才走到了这一步:[http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/comment-page-5/#comment-62428][ 1]
这就是我的 dbhelper 的样子:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
public class Databasehelper extends SQLiteOpenHelper
private static String DB_PATH = "/data/data/com.map.mapguide/databases/";
private static String DB_NAME = "mapDB";
private SQLiteDatabase myDataBase;
private final Context myContext;
public Databasehelper(Context context)
super(context, DB_NAME, null, 1);
this.myContext = context;
public void createDataBase() throws IOException
boolean dbExist = checkDataBase();
if(dbExist)
else
this.getReadableDatabase();
try
copyDataBase();
catch (IOException e)
throw new Error("Error copying database");
public boolean checkDataBase()
SQLiteDatabase checkDB = null;
try
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
catch(SQLiteException e)
//database does't exist yet.
if(checkDB != null)
checkDB.close();
return checkDB != null ? true : false;
private void copyDataBase() throws IOException
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0)
myOutput.write(buffer, 0, length);
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
public void openDataBase() throws SQLException
//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
@Override
public synchronized void close()
if(myDataBase != null)
myDataBase.close();
super.close();
@Override
public void onCreate(SQLiteDatabase db)
// TODO Auto-generated method stub
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
// TODO Auto-generated method stub
在我的主类中扩展了 MapActivity。这是我控制地图上的动作。如何从我的数据库中检索数据并在我的主类中设置经度和纬度。
非常感谢您的帮助。我已经这样做了大约 2-3 天,但仍然无法弄清楚我做错了什么。 [1]:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/comment-page-5/#comment-62428
提前非常感谢!
八米
【问题讨论】:
【参考方案1】:这个devx tutorial 可以帮助你。一步一步地了解它是如何使用无限制的 Log 工作的。统治设计和 devx 教程都对我有很大帮助,现在我有一个外部初始化的多表数据库,包装在 ContentProvider 中,它就像一个魅力。
首先尝试获取所有数据并将光标与简单的 ListActivity 一起使用。如果这不起作用并且只要您不真正了解如何操作,那么增加更多复杂性是没有意义的。
我的两分钱。
-----更新:
改编自我的 ContentProvider 类,试试
CustomHelper dbHelper = new CustomHelper(context);
try
dbHelper.createDatabase();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
myDB = dbHelper.getWritableDatabase();
try
dbHelper.openDatabase();
catch(SQLException sqle)
throw sqle;
然后在 myDB 上查询
Cursor c = sqlBuilder.query(
ofopsDB,
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
然后您可以控制记录c.getCount()
的结果并使用c.moveToFirst()
测试第一个元素的内容。
【讨论】:
感谢您的回复。我之前已经完成了本教程,我可以从我的数据库中获取数据。但我现在所做的是使用 SQLite 数据库浏览器创建了一个数据库。现在的问题是我不知道如何检索数据。 我明白了。我成功地在 à ContentProvider 中做到了这一点。就我而言,我在提供程序的查询方法中使用了 SQLiteQueryBuilder。以上是关于需要帮助从 SQLite 数据库中获取数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Javascript 中的 SQLite 数据库中获取表数据?