http://www.sqlite.org/threadsafe.html
从上面的链接我了解到,SQLite支持三种不同的线程模式:单线程,多线程和序列化.我很想知道"Android中SQLite的默认线程模式是什么"?有没有办法以务实的方式改变线程模式?如果是这样,我得到的优势是什么?什么时候选择带有一些样品的?
提前致谢.
我不能删除触发器,但当我尝试创建一个具有相同名称的新触发器时 - 它会提醒我触发器存在.所以,我想列出所有触发器,找出问题所在.
我正在制作我的第一个Android应用程序,我首先学习了一些sqlite教程,这教我使用扩展SQLiteOpenHelper的databaseHelper.所以我的databaseHelper确实扩展了SQLiteOpenHelper.我在Logcat中收到了一个sqlite连接泄漏警告,所以想要了解如何解决这个问题.
我收到此错误:
02-01 21:39:50.740: W/SQLiteConnectionPool(32061): A SQLiteConnection object for database '/data/data/com.btf271.fashionassistant/databases/clothingManager' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
Run Code Online (Sandbox Code Playgroud)
我的databaseHelper函数在发生泄漏时被调用:
public List<Sticker> getObjectsByGenderAndCategory(String gender, String category) {
List<Sticker> objects = new ArrayList<Object>();
String selectQuery = String.format(
"SELECT * FROM %s WHERE %s = \"%s\" AND %s = \"%s\"",
TABLE_OBJECT, KEY_GENDER, gender, KEY_CATEGORY, category);
Log.e(LOG, selectQuery);
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
try{ …Run Code Online (Sandbox Code Playgroud) 尝试使用SQLiteOpenHelper扩展类,但是此错误显示:"android.database.sqlite.SQLitepenhelper中没有可用的默认构造函数"以及其他"无法解析符号类别,注意......"
class DbHelper extends SQLiteOpenHelper {
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(Category.getSql());
db.execSQL(Note.getSql());
db.execSQL(Attachment.getSql());
db.execSQL(CheckItem.getSql());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + Category.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + Note.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + Attachment.TABLE_NAME);
db.execSQL("DROP TABLE IF EXISTS " + CheckItem.TABLE_NAME);
onCreate(db);
}
Run Code Online (Sandbox Code Playgroud) public class BobDatabase extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "bob.db";
private static final int DATABASE_VERSION = 1;
public static final String DEFAULT_PROFILE = "default_profile";
public BobDatabase(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database)
{
createProfileTable(database);
createTimeTable(database);
createEventTable(database);
createLocationTable(database);
}
/**
* Creates a table for Profile objects, executes the string create_profile_table_sql
* contained within strings.xml
* @param database
*/
public void createProfileTable(SQLiteDatabase database)
{
database.execSQL(Resources.getSystem().getString(R.string.create_profile_table_sql));
}}
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
01-14 12:20:57.591:E/AndroidRuntime(1825):引起:android.content.res.Resources $ NotFoundException:字符串资源ID#0x7f040003
导致错误的代码是createProfileTable中的单行,具体是Resources.getSystem().getString(R.string.create_profile_table_sql) …
我觉得Android开发人员关于在SQLite中保存数据的准则确实缺乏.当谈到多个表时,我很困惑一般指南是什么.
我目前有两个管理器向UI公开(CRUD)两组不同的实体.
我是:
在每个Manager中创建一个私有类SQLiteOpenHelper.每个Helper都有自己的onCreate用于自己的TABLE?
要么
创建一个创建两个TABLE的单个公共类SQLiteOpenHelper?
我没有看到使用一个在另一个之上的明显优势,但我看到它们都被使用了.Android对此有何看法?
所以我想出了一些想法,我想知道它是否可以实现.
假设我有多个表(数据库模型),每个表都由某个类表示.我不会使用单一模式和open helper,所以我创建了一个简单的类来提供数据库的单个实例.我我们的想法是,只要所有表都引用SQLiteDatabase(由open helper返回),它们都将使用相同的数据库实例,并且可能不需要将工作与数据库同步,因为open helper执行此操作.当最后一个表完成它的工作GC将收集打开的帮助器(因为最后一个引用将是弱引用) - >调用finalize()并在此方法期间关闭db以防止来自OS的任何警告.我的问题是:这可以工作吗?它会自动关闭数据库,它会泄漏还是抛出一些异常?
这是我的班级:
public class DatabaseHelper {
private static WeakReference<SomeCustomOpenHelper> sDBOpenHelper;
private void notifyDBCreate(SQLiteDatabase db) {
for (DBTable table : mTables) {
table.onDBCreate(db);
}
}
private void notifyDBUpgrade(SQLiteDatabase db) {
for (DBTable table : mTables) {
table.onDBUpgrade(db);
}
}
public SQLiteDatabase getDatabase(boolean readOnly) {
SomeCustomOpenHelper dbHelper = sDBOpenHelper.get();
if (dbHelper == null) {
dbHelper = new SomeCustomOpenHelper(context, name, factory, version, new DatabaseEventsCallback());
sDBOpenHelper = new WeakReference<SomeCustomOpenHelper>(dbHelper);
}
if (readOnly) {
return dbHelper.getReadableDatabase();
} else { …Run Code Online (Sandbox Code Playgroud) 在我的Android应用程序中:如何在SQLiteOpenHelper的onCreate方法中访问Context?
我有一个问题,我不知道如何处理它.我的应用中的一项活动有多个AsyncTasks访问单个SQLiteOpenHelper.我初始化并打开帮助程序onCreate(),我正在关闭它onStop().我还检查它是否已经初始化onResume().
由于我已经发布了我的应用程序,因此doInBackground在尝试访问数据库帮助程序时,我收到了Null Exception错误的数量.我知道这是因为DB onStop()在doInBackground被调用之前就已经关闭了(公平).
我的问题是,我应该在哪里关闭数据库连接?在Activity中使用DB帮助程序的单个实例并从多个线程(AsyncTasks)访问它是正确的吗?或者我应该为每个使用单独的DB帮助程序实例AsyncTask?
这是我活动的简化骨架:
public class MyActivity extends Activity{
private DbHelper mDbHelper;
private ArrayList<ExampleObject> objects;
@Override
public void onStop(){
super.onStop();
if(mDbHelper != null){
mDbHelper.close();
mDbHelper = null;
}
}
@Override
public void onResume(){
super.onResume();
if(mDbHelper == null){
mDbHelper = new DbHelper(this);
mDbHelper.open();
}
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
DbHelper mDbHelper = new DbHelper(this);
mDbHelper.open();
}
private …Run Code Online (Sandbox Code Playgroud) 我是开发新手,通过将图像转换为字节数组并将其存储到 BLOB 中的 SQLite 数据库(在下面的代码中找到),我成功地将图像存储到数据库中。但是我不知道如何将音频/视频存储到数据库中,任何人都可以帮助我 PLZ ...
public void getImage(View view){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/* video/*");
startActivityForResult(Intent.createChooser(intent, "select picture"), 1);
}
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(resultCode == RESULT_OK){
Uri imageUri = data.getData();
String imagePath = getPath(imageUri);
image1.setVisibility(View.VISIBLE);
image1.setImageURI(imageUri);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
Toast.makeText(getApplicationContext(), ""+bitmap, Toast.LENGTH_SHORT).show();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
img = byteArrayOutputStream.toByteArray();
}
}
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, …Run Code Online (Sandbox Code Playgroud) sqlite android sqliteopenhelper android-sqlite android-database
sqliteopenhelper ×10
android ×9
sqlite ×7
constructor ×1
database ×1
default ×1
eclipse ×1
java ×1
memory-leaks ×1