需要帮助从 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 数据库中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 php 中从 sqlite3 数据库中获取数据

如何从 Javascript 中的 SQLite 数据库中获取表数据?

使用函数从sqlite数据库中获取指定数据?

如何从mysql中获取数据并存储在android的Sqlite数据库中

在 SQLite 中组合两列的巧妙方法?

为啥 SQLite 需要这么长时间来获取数据?