我遇到了错误,但似乎无法找到解决方案.我的应用程序正在使用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)
有关如何解决这个问题的任何建议?
以下查询在我的设备上运行正常(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
我想使用预加载的数据库.数据库必须附在应用程序中,然后才能更新.我对如何连接以避免问题有很多疑问.我问那些处理问题的专业人士.谢谢.
如果我的基数大于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").哪个选项更好(更容易 - 更改扩展名).
可能会失败"没有这样的表android_metadata",但我手动添加到数据库en_US,但如果应用程序多语言怎么办?
在读取数据库时,我使用的方法是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) 我有一个像这样的数据库表:
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) 我正在尝试从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)
谢谢.
我有一个片段,按以下方式列出"学期":它访问数据库,生成一个数组,然后通过一个数据转换成视图ListAdapter.
在该片段中还有一个用于打开新活动的添加按钮,其中用户可以创建新的学期,该学期也被插入到同一活动的数据库中.
创建一个学期后,我很明显希望在用户返回列表时显示它.
为此我有两个选择:
Parcelable在我的大多数类上实现接口,因为它们是嵌套的,这将非常繁琐.我的问题是; 哪种方式会更快更有效?数据库可能会超时,但对于parcel对象也是如此,特别是当它们嵌套并且有List自定义对象等时,这使得这个决定更加重要.
如果条目时间戳与今天的日期匹配,我想从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在数据库中.
我有一个测试创建一个活动,试图从数据库中获取一些数据.这与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) 我在这里阅读了很多关于StackOverflow的讨论,还有很多关于互联网网站的讨论:我什么时候应该打开和关闭我的sqlite数据库.我已经阅读了不同时期的各种回应和猜测.所以最后我比以前更困惑.人们建议:
在onDestroy()中关闭你的数据库注释:"OnDestroy()总是不被调用!使用onStop()!" - >所以onStart()必须打开它.
数据库有效地工作.无需关闭它.
打开数据库一次,创建一个字段和一个访问者.
使用后关闭.
还有很多...
那么2016年什么是正确的呢?请不要猜!
Examplelinks:
所以基本上我正在使用空间并尝试添加从数据库版本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 ×10
android-sqlite ×10
sqlite ×3
android-room ×1
cursor ×1
database ×1
parcelable ×1
performance ×1
robolectric ×1
sql ×1