Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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
SDcard上的android SQLite数据库,插入数据并获取结果,无需使用SQLiteOpenHelper_Android_Sqlite_Android Sqlite - Fatal编程技术网

SDcard上的android SQLite数据库,插入数据并获取结果,无需使用SQLiteOpenHelper

SDcard上的android SQLite数据库,插入数据并获取结果,无需使用SQLiteOpenHelper,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,以下是在SD卡上创建DB的代码 我没有使用默认的SQLiteOpenHelper,这里使用的是构造函数。。处理程序类将在主类中用于实例化 public class DatabaseHandler { private static final String TAG = "DatabaseHelper"; private static final int DATABASE_VERSION = 1; private static final String DATABA

以下是在SD卡上创建DB的代码 我没有使用默认的SQLiteOpenHelper,这里使用的是构造函数。。处理程序类将在主类中用于实例化

public class DatabaseHandler {
     private static final String TAG     = "DatabaseHelper";
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "contactsManagerDB";
    private static final String TABLE_CONTACTS = "contacts";
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_PH_NO = "phone_number";
    public SQLiteDatabase      database;
   File file_str      = Environment.getExternalStorageDirectory();
   String DATABASE_FILE_PATH = file_str.toString();

   public DatabaseHandler(Context context) {
         try
            {
             Log.i(TAG, "donedddddd");
            database = SQLiteDatabase.openOrCreateDatabase(DATABASE_FILE_PATH
                    + File.separator + DATABASE_NAME, null);
            }
            catch (SQLiteException ex)
            {
                String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                        + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                        + KEY_PH_NO + " TEXT" + ")";
                database.execSQL(CREATE_CONTACTS_TABLE);

            }
            finally
            {
           database.close();
            }

    }
    // Adding new contact
    void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone
// Inserting Row
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Closing database connection
    }

    private SQLiteDatabase getWritableDatabase() {
         database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
                    + File.separator + DATABASE_NAME, null,
                    SQLiteDatabase.OPEN_READONLY);
            return database;
    }

    private SQLiteDatabase getReadableDatabase() {
          database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
                    + File.separator + DATABASE_NAME, null,
                    SQLiteDatabase.OPEN_READWRITE);
            return database;
    }

    // Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        // return count
        return cursor.getCount();
    }
}
//////////
编辑:感谢您的大力帮助。经过测试,我意识到这是有问题的代码。当我尝试添加时,它崩溃了。有解决办法吗

     // Adding new contact
       void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone

        // Inserting Row
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Closing database connection
    }
编辑编号2: 最后,我可以插入。但获取结果是一个问题。这是在DatabaseHandler类中获取联系人计数的方法

    // Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        // return count
        return cursor.getCount();
    }
在MainClass中,如果我尝试使用DatabaseHandler db=new DatabaseHandler(此选项)

//在此处插入代码,该代码有效//

db.getContactScont()//即使我在整数变量中捕捉到此行,它也会失败。

谢谢

编辑编号3: 最后,根据用户2953017vigbyor的建议,我能够插入并获取结果。以下是修改后的代码:

    public int getContactsCount() {
        int count=0;
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        while (cursor.moveToNext()) {
           count++;
         }
        cursor.close();
        db.close();
        // return count
        return count;
    }
在课堂上

    DatabaseHandler db = new DatabaseHandler(this);
    Integer c;

        db.addContact(new Contact("Sandeep", "1234567"));
        db.addContact(new Contact("Pareek", "12345678"));

        Log.e(TAG, "ADD SUCCESS");   

    c= db.getContactsCount();
 //Toast just to make sure the number of records are returned.
    Toast.makeText(getApplicationContext(), c.toString() , Toast.LENGTH_SHORT).show();
希望它也能帮助别人。
谢谢

为什么要在catch块中插入数据

    catch (SQLiteException ex)
        {
            String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                    + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                    + KEY_PH_NO + " TEXT" + ")";
            database.execSQL(CREATE_CONTACTS_TABLE);

        }
您应该在try块中编写这些代码,如下所示

    try
    {
        Log.i(TAG, "donedddddd");
        database = SQLiteDatabase.openOrCreateDatabase(DATABASE_FILE_PATH
                + File.separator + DATABASE_NAME, null);
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        database.execSQL(CREATE_CONTACTS_TABLE);
    }
    catch (SQLiteException ex)
    {
        ex.printStackTrace();
    }
    finally
    {
        database.close();
    }

我认为应用程序正在崩溃,因为db值为null。 试试这个代码

void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
if (null != db) {

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone

        // Inserting Row
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Closing database connection
    }
else 
Log.d("db is null");
}
或者您可以将上述代码放入try-catch块中

编辑: 您正在调用cursor.close() 这意味着它关闭光标,释放其所有资源,使其完全无效。 在方法中检索到特定对象的值后,可以关闭光标

将代码更改为:

public int getContactsCount() {
        int count;
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        if (cursor != null) {
            count = cursor.getCount();
            cursor.close();
         }

        // return count
        return count();
    }

@ketan应用程序崩溃。。但是DB是在SDCard上物理创建的,请发布logcat stacktrace-这段代码有很多可能崩溃的方法。logcat由于一些奇怪的原因不适合我:(至少在构造函数catch块中,不要忽略异常,而是记录它。Logcat不会响应我的日志条目,如
log.i(TAG,“reporttt”);
当我添加日志过滤器时,它只显示空白标记。使用“AndroidRuntime”过滤日志cat标记并发布这些消息。仍然没有显示任何内容。我在主代码中添加了一个编辑。请看一看。最后我也可以插入数据,但当我尝试获取结果时,应用程序崩溃。我不知道是否是因为任何PK错误(PK不是空的,所以它会自动创建)或者可能与表的架构有关。我已经确认查看数据库时它存在,并且插入了值。问题本身正在进行第二次编辑。谢谢。实际上,我的插入代码也起了作用。问题在于获取结果。我将编辑代码。谢谢。您的代码消除了我的错误,即。关闭数据库,检查光标是否为null val并关闭光标。但是,我做了一些问题中编辑的事情。