Android 数据库在emulator中工作正常,但在设备上出现错误
我的应用程序在运行时会创建一个数据库,并在其中存储一些基本数据。 但是,当我尝试在设备上运行应用程序时,当它在模拟器上运行且功能完全正常时,出现“无法打开数据库”错误 我的主要活动是Android 数据库在emulator中工作正常,但在设备上出现错误,android,database,sqlite,emulation,Android,Database,Sqlite,Emulation,我的应用程序在运行时会创建一个数据库,并在其中存储一些基本数据。 但是,当我尝试在设备上运行应用程序时,当它在模拟器上运行且功能完全正常时,出现“无法打开数据库”错误 我的主要活动是 import android.app.Activity; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import andro
import android.app.Activity;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;
public class MainActivity extends Activity
{
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("sarhad","Initializing data");
DatabaseHelper db = new DatabaseHelper(this);
Cursor cursor;
ListView listSongs;
SimpleCursorAdapter adapter;
final String[] FROM = { db.KEY_SONGNAME, db.KEY_ARTISTNAME, db.KEY_LABELNAME };
final int[] TO = { R.id.textViewSONG, R.id.textViewARTIST, R.id.textViewLABEL };
try
{
db.openDataBase();
} catch (SQLException sqle)
{
throw sqle;
}
listSongs = (ListView) findViewById(R.id.listSongsView);
db.getWritableDatabase();
Log.i("tag","Initializing query");
String queryStr = "SELECT * FROM songs";
Log.i("tag","before : cursor = db.getSongs(queryStr);");
cursor = db.getSongs(queryStr);
Log.i("tag","after : cursor = db.getSongs(queryStr);");
startManagingCursor(cursor);
adapter = new SimpleCursorAdapter(this, R.layout.row, cursor, FROM,TO);
listSongs.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
我的databasehelper类是
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper
{
static final int DATABASE_VERSION = 1;
public static String DB_PATH = "";
// Database Name
static final String DATABASE_NAME = "songsDB";
// Contacts table name
static final String TABLE_SONGS = "songs";
// Contacts Table Columns names
static final String KEY_ID = "_id";
static final String KEY_SONGNAME = "songname";
static final String KEY_ARTISTNAME = "artistname";
static final String KEY_LABELNAME = "labelname";
private SQLiteDatabase db = null;
private final Context myContext = null;
private static DatabaseHelper mDBConnection;
//////////////////////////////////////////////////////////////////////////////////
public DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
DB_PATH = "/data/data/" + context.getApplicationContext().getPackageName() + "/databases/";
}
//////////////////////////////////////////////////////////////////////////////////
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db)
{
String CREATE_SONGS_TABLE = "CREATE TABLE " + TABLE_SONGS + "("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_SONGNAME
+ " TEXT," + KEY_ARTISTNAME + " TEXT," + KEY_LABELNAME
+ " TEXT);";
db.execSQL(CREATE_SONGS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SONGS);
onCreate(db);
}
//////////////////////////////////////////////////////////////////////////////////
void addSong(String song, String singer, String label)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_SONGNAME, song);
values.put(KEY_ARTISTNAME, singer);
values.put(KEY_LABELNAME, label);
db.insert(TABLE_SONGS, null, values);
db.close();
}
public Cursor getSongs(String queryStr)
{
return db.rawQuery(queryStr, null);
}
///////////////////////////////////////////////////////////////////////
public SQLiteDatabase openDataBase() throws SQLException
{
String myPath = DB_PATH + DATABASE_NAME;
db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
return db;
}
/**
* Close the database if exist
*/
@Override
public synchronized void close()
{
if (db != null)
db.close();
super.close();
}
}我认为你弄乱了路径,真实的设备不会让你把文件放在那个位置,而模拟器会。尝试完全删除路径,让系统确定将数据库放在何处。一旦您知道它是这样工作的,那么您可以返回并根据需要修改路径。您应该提供有关目标平台和所用语言的详细信息。@CMKanode。我发布了代码。请看一看。我正在编写API 10。您可能会发现它非常有用:谢谢您的回复。然而,问题并不存在。我现在解决了这个问题。调用时:DatabaseHelper db=newdatabasehelper(this);是的,您正在为将要创建的数据库分配空间,但是,在对其应用查询之前,该数据库不会在路径中。在我的例子中,我应用了一个add查询(我的helper类中的方法),直到在路径中找到我的DB,我才能够访问它。记住这一点,当出现这样的错误时,如果事情不起作用,首先一定要尝试对其应用一个虚拟查询。事实上,人们不应该假定知道应用程序私有目录的路径是什么。在今天的大多数设备上,这种猜测可能是正确的,但可能不是全部或始终如此。然而,这可能是也可能不是这里看到的失败的原因。感谢您的回复。然而,问题并不存在。我现在解决了这个问题。调用时:DatabaseHelper db=newdatabasehelper(this);是的,您正在为将要创建的数据库分配空间,但是,在对其应用查询之前,该数据库不会在路径中。在我的例子中,我应用了一个add查询(我的helper类中的方法),直到在路径中找到我的DB,我才能够访问它。记住这一点,当出现这样的错误时,如果事情不起作用,一定要首先尝试对其应用虚拟查询。我必须问一下,为什么要定义路径。您可以使用
SQLiteOpenHelper
类中的getReadableDatabase
和getWriteableDatabase
方法打开数据库,而不必担心路径或名称。避免了许多潜在的错误和特定于设备的问题。如果您必须定义路径,我建议使用而不是硬编码,以确保它可以正常工作,并且在用户卸载您的应用程序时得到清理。