SDcard上的android SQLite数据库,插入数据并获取结果,无需使用SQLiteOpenHelper
以下是在SD卡上创建DB的代码 我没有使用默认的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
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:
最后,根据用户2953017和vigbyor的建议,我能够插入并获取结果。以下是修改后的代码:
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并关闭光标。但是,我做了一些问题中编辑的事情。