标签: android-sqlite

错误:尝试重新查询已关闭的游标

我遇到了错误,但似乎无法找到解决方案.我的应用程序正在使用ICS 4.0.3,但它在Android 3.2上返回错误.这是我MainActivity.java文件中的代码:

SQLiteDatabase db = databaseHelper.getReadableDatabase();
         Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, new String[]{"_id","isim","icerik"}, null, null, null, null, null);
         startManagingCursor(cursor);
         tts=0;



         while(cursor.moveToNext()){
            if(tts==0)
             {            
            array_spinner=new String[cursor.getCount()+1];
            array_spinner[tts]= "FAVOR?";
             }
            array_spinner2[tts+1]= cursor.getString((cursor.getColumnIndex("isim")));
            array_spinner3[tts+1]= cursor.getString((cursor.getColumnIndex("icerik")));
             tts++;
            } 

         ss2 = (Spinner) findViewById(R.id.spinner2);
         ArrayAdapter<Object> adapter  = new ArrayAdapter<Object>(this,R.layout.row2, R.id.weekofday2, array_spinner2);
            ss2.setAdapter(adapter);
        } catch (Exception e) {}
Run Code Online (Sandbox Code Playgroud)

有关如何解决这个问题的任何建议?

android cursor android-sqlite

4
推荐指数
1
解决办法
6001
查看次数

Android API 8,10 ContactsContract.Data.HAS_PHONE_NUMBER没有这样的列

以下查询在我的设备上运行正常(API 15).它在运行API 8或API 10的模拟器中不起作用.

这是查询:

Cursor contactsCur = getContentResolver().query(
  ContactsContract.Data.CONTENT_URI,
  new String[] { ContactsContract.Data._ID,
    ContactsContract.Data.CONTACT_ID,
    ContactsContract.Data.DISPLAY_NAME,
    ContactsContract.CommonDataKinds.Organization.COMPANY,
    ContactsContract.CommonDataKinds.Phone.TYPE,
    ContactsContract.Data.LOOKUP_KEY,
    ContactsContract.CommonDataKinds.Phone.NUMBER,
    Contacts.Data.MIMETYPE,
    ContactsContract.CommonDataKinds.Phone.MIMETYPE,
    ContactsContract.CommonDataKinds.StructuredPostal.CITY,
    ContactsContract.CommonDataKinds.StructuredPostal.STREET,
    ContactsContract.CommonDataKinds.StructuredPostal.REGION,
    ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE},
  ContactsContract.Data.HAS_PHONE_NUMBER + " >? ",
  new String[] { "0" },
  ContactsContract.Data.DISPLAY_NAME + " COLLATE NOCASE ASC");
Run Code Online (Sandbox Code Playgroud)

以下是它抛出的异常: android.database.sqlite.SQLiteException: no such column: has_phone_number: , while compiling: SELECT _id, contact_id, display_name, data1, data2, lookup, data1, mimetype, mimetype, data7, data4, data8, data9 FROM view_data_restricted data WHERE (1) AND (has_phone_number >? ) ORDER BY display_name COLLATE NOCASE ASC …

android android-emulator contactscontract android-contacts android-sqlite

4
推荐指数
1
解决办法
3244
查看次数

如何正确使用Android中预装的数据库

我想使用预加载的数据库.数据库必须附在应用程序中,然后才能更新.我对如何连接以避免问题有很多疑问.我问那些处理问题的专业人士.谢谢.

  1. 如果我的基数大于1 MB,则会弹出错误D/asset(909):数据超过UNCOMPRESS_DATA_MAX.可以分解为小于1兆字节的片段,并且可以更改为增加(".jpg",".Jpeg",".Png",".Gif",".wav",".mp2",". mp3",".ogg",".aac",".mpg",".mpeg",".mid",".midi",".smf",".jet",".rtttl",". imy",".xmf",".mp4",".m4a",".m4v",".3 gp",".3 gpp",".3 g2",".3 gpp2",".amr ",".awb",".wma",".wmv").哪个选项更好(更容易 - 更改扩展名).

  2. 可能会失败"没有这样的表android_metadata",但我手动添加到数据库en_US,但如果应用程序多语言怎么办?

  3. 在读取数据库时,我使用的方法是mDb = getReadableDatabase();,但是我正在接近阅读的结尾 - mDb.close(); 正如他们在互联网上所说,可能无关心任何错误无法打开数据库文件.这尤其适用于HTC设备.

以下引用代码

public class QuestionsDbAdapter extends SQLiteOpenHelper {

private String DATABASE_PATH = "/data/data/YOUR_PACKAGE/";
public static final String DATABASE_NAME = "mantestQuestions";

public static final String TABLE_QUESTIONS = "Questions";
public static final String QUESTIONS_COLUMN_ID = "_id";
public static final String QUESTIONS_COLUMN_QUESTION ="Question";

public static final String TABLE_ANSWERS = "Answers";
public static final String ANSWERS_COLUMN_ID = "_id";
public static final String ANSWERS_COLUMN_QUESTION_ID = "QuestionId";
public …
Run Code Online (Sandbox Code Playgroud)

android android-sqlite

4
推荐指数
1
解决办法
3080
查看次数

ListView/CursorAdapter即时生成列表标题

我有一个像这样的数据库表:

ID
NAME
COUNTRY_NAME
Run Code Online (Sandbox Code Playgroud)

我想要一个这样的列表:

+ Italy
    - Potato
    - Tomato
+ France
    - Fromage
    - Baguette
Run Code Online (Sandbox Code Playgroud)

我写了一个CursorAdapter,每次调用requery时,读取表上的所有项目并将其映射到一个对象中,该对象用于映射每个项目(真实项目或标题)的位置.

private  static class PersonEntry {
    boolean isHeader;
    String countryName;
    int realPos;
    int id;
}
Run Code Online (Sandbox Code Playgroud)

代码是这样的:

 /* cursor generated by querying whole table */

 public void readHeaders(Cursor cursor ) {
    Log.d(this.getClass().getSimpleName(),"readHeaders init");
    items = new ArrayList<PersonEntry >();
    this.mCursor = cursor;

    cursor.moveToFirst();
    int i = 0;
    String previousCountry = "";
    String currentCountry;
    while(cursor.isAfterLast() == false)  {
        int id = cursor.getInt(cursor.getColumnIndexOrThrow(Match.ROW_ID));
        currentCountry = cursor.getString(cursor.getColumnIndexOrThrow(Person.ROW_COUNTRY_NAME));
        if …
Run Code Online (Sandbox Code Playgroud)

performance android android-listview android-sqlite

4
推荐指数
1
解决办法
2456
查看次数

SQLITE SUM和LIMIT似乎不能一起工作

我正在尝试从SQLITE中检索列的总和.我能够成功地获得它.但是当我尝试仅检索10行的总和时,它再次返回整列的总和.但查询似乎是正确的.

public String getUnitsForWeek(Context context) throws IOException {
    DataBaseHelper dbHelper = new DataBaseHelper(context);

    String query = "SELECT sum(UNITS) FROM SERVICE_TABLE order by id DESC limit 7";
    return String.valueOf(dbHelper.getString(query));

}
Run Code Online (Sandbox Code Playgroud)

dbHelper.getString方法是:

public int getString(String query) {
    String mypath = DB_PATH + DB_NAME;
    SQLiteDatabase database = SQLiteDatabase.openDatabase(mypath, null, 
            SQLiteDatabase.OPEN_READWRITE);
    Cursor cursor = null;

    int i;

    cursor = database.rawQuery(query, null);


    cursor.moveToFirst();
    i= cursor.getInt(cursor.getColumnIndex(cursor.getColumnName(0)));
    return i;

}
Run Code Online (Sandbox Code Playgroud)

谢谢.

sql sqlite android android-sqlite

4
推荐指数
1
解决办法
826
查看次数

Parcelable与数据库读取的效率

我有一个片段,按以下方式列出"学期":它访问数据库,生成一个数组,然后通过一个数据转换成视图ListAdapter.
在该片段中还有一个用于打开新活动的添加按钮,其中用户可以创建新的学期,该学期也被插入到同一活动的数据库中.

创建一个学期后,我很明显希望在用户返回列表时显示它.
为此我有两个选择:

  • 将创建的Semester作为对象发送回片段.问题是它需要我Parcelable在我的大多数类上实现接口,因为它们是嵌套的,这将非常繁琐.
  • 使列表从数据库中重新读取学期并从头开始重新创建视图.

我的问题是; 哪种方式会更快更有效?数据库可能会超时,但对于parcel对象也是如此,特别是当它们嵌套并且有List自定义对象等时,这使得这个决定更加重要.

android parcelable android-fragments android-sqlite

4
推荐指数
1
解决办法
1095
查看次数

如果时间戳与今天的日期匹配,则SQLite选择行

如果条目时间戳与今天的日期匹配,我想从SQLite表中选择所有条目.

我正在查询SQLite数据库,如下所示:

// Tasks table name
private static final String TABLE_TASKS = "tasks";

// Tasks Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_TIMESTAMP = "timestampGMT";
private static final String KEY_DESCRIPTION = "description";


String selectQuery = "SELECT  * FROM " + TABLE_TASKS + " WHERE "+ KEY_TIMESTAMP+">=date('now', '-1 day')";
Run Code Online (Sandbox Code Playgroud)

这种行为是我最接近的行为,但我不希望在过去24小时内选择所有条目.我只想选择今天的日期是否与时间戳匹配.

如何仅选择表中时间戳与今天日期匹配的行.

日期格式为:2014-07-05 12:59:35在数据库中.

sqlite android android-sqlite

4
推荐指数
1
解决办法
3770
查看次数

Robolectric访问数据库会引发错误

我有一个测试创建一个活动,试图从数据库中获取一些数据.这与SQLiteException失败

17:40:40.528 [DEBUG] [TestEventLogger]     android.database.sqlite.SQLiteException: Cannot open SQLite connection, base error code: 14
17:40:40.528 [DEBUG] [TestEventLogger]      at org.robolectric.shadows.ShadowSQLiteConnection.rethrow(ShadowSQLiteConnection.java:53)
17:40:40.528 [DEBUG] [TestEventLogger]      at org.robolectric.shadows.ShadowSQLiteConnection.access$600(ShadowSQLiteConnection.java:30)
17:40:40.529 [DEBUG] [TestEventLogger]      at org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:443)
17:40:40.529 [DEBUG] [TestEventLogger]      at org.robolectric.shadows.ShadowSQLiteConnection$Connections.open(ShadowSQLiteConnection.java:345)
17:40:40.529 [DEBUG] [TestEventLogger]      at org.robolectric.shadows.ShadowSQLiteConnection.nativeOpen(ShadowSQLiteConnection.java:58)
17:40:40.529 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteConnection.nativeOpen(SQLiteConnection.java)
17:40:40.529 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
17:40:40.529 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
17:40:40.529 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
17:40:40.530 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
17:40:40.530 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
17:40:40.530 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
17:40:40.530 [DEBUG] [TestEventLogger]      at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
17:40:40.530 [DEBUG] …
Run Code Online (Sandbox Code Playgroud)

android robolectric android-sqlite

4
推荐指数
1
解决办法
2155
查看次数

Android打开和关闭数据库

我在这里阅读了很多关于StackOverflow的讨论,还有很多关于互联网网站的讨论:我什么时候应该打开和关闭我的sqlite数据库.我已经阅读了不同时期的各种回应和猜测.所以最后我比以前更困惑.人们建议:

  1. 在onDestroy()中关闭你的数据库注释:"OnDestroy()总是不被调用!使用onStop()!" - >所以onStart()必须打开它.

  2. 数据库有效地工作.无需关闭它.

  3. 打开数据库一次,创建一个字段和一个访问者.

  4. 使用后关闭.

还有很多...

那么2016年什么是正确的呢?请不要猜!

Examplelinks:

Android:打开和关闭SQLite数据库

Android关闭数据库

database sqlite android android-sqlite

4
推荐指数
1
解决办法
4122
查看次数

房间迁移改变表不添加新列和迁移一次又一次地调用

所以基本上我正在使用空间并尝试添加从数据库版本1到2的迁移,但我的alter命令不起作用我的当前实现如下:

 void init() {
    db = Room.databaseBuilder(Global.getInstance(),
            AppDatabase.class, "feed").addMigrations(MIGRATION_1_2).build();
}
Run Code Online (Sandbox Code Playgroud)

迁移属性:

static final Migration MIGRATION_1_2 = new Migration(1,2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {


        database.execSQL("ALTER TABLE 'post' ADD COLUMN 'age' INTEGER NOT NULL DEFAULT 0");
        Log.d("VROM","Migration");
    }
};
Run Code Online (Sandbox Code Playgroud)

数据库实施:

@Database(entities = {Feed.class, DownloadModel.class}, version = 1) public abstract class AppDatabase extends RoomDatabase {
public abstract DaoAccess getFeedDao();}
Run Code Online (Sandbox Code Playgroud)

因此,在将版本从1递增到2之后,execSQL()会执行,但我的数据库中未添加新列.我从app目录中取出了我的数据库并多次检查但是列不在那里.除此之外,如果我杀了我的应用程序再次启动它再次migrate调用该方法,不知道这是否是预期的功能,但它打破了我的功能.我认为迁移只会被调用一次onUpgrade()

android android-sqlite android-room

4
推荐指数
1
解决办法
5422
查看次数