我正在创建一个应用程序,显示谷歌地图上某些咖啡馆的位置。我希望我的应用程序从数据库中获取咖啡馆的经度和纬度,并使用它们在我的地图上设置标记。
我已经阅读了很多关于如何使用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
提前多多感谢!
巴米
答案 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()
测试第一个元素的内容。