Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 数据库在emulator中工作正常,但在设备上出现错误_Android_Database_Sqlite_Emulation - Fatal编程技术网

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
方法打开数据库,而不必担心路径或名称。避免了许多潜在的错误和特定于设备的问题。如果您必须定义路径,我建议使用而不是硬编码,以确保它可以正常工作,并且在用户卸载您的应用程序时得到清理。