需要帮助从SQLite数据库中获取数据

时间:2011-03-31 21:03:05

标签: android sqlite

我正在创建一个应用程序,显示谷歌地图上某些咖啡馆的位置。我希望我的应用程序从数据库中获取咖啡馆的经度和纬度,并使用它们在我的地图上设置标记。

我已经阅读了很多关于如何使用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 个答案:

答案 0 :(得分:0)

devx tutorial可能会对您有所帮助。继续一步一步地使用Log无限制地了解它是如何工作的。 reigndesign和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()测试第一个元素的内容。