Android从数据库中提取数据
我正在尝试提取数据库的历史记录。。。。然而,它从不拉任何东西。。。有人知道我做错了什么吗 以下是内容提供商:Android从数据库中提取数据,android,Android,我正在尝试提取数据库的历史记录。。。。然而,它从不拉任何东西。。。有人知道我做错了什么吗 以下是内容提供商: package com.projectcaruso.naturalfamilyplaning; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor;
package com.projectcaruso.naturalfamilyplaning;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
public class StatusProvider extends ContentProvider {
private static final String TAG = StatusProvider.class.getSimpleName();
public static final Uri CONTENT_URI = Uri.parse("content://com.projectcaruso.naturalfamilyplaning.statusprovider");
public static final String SINGLE_RECORD_MIME_TYPE = "vnd.android.cursor.item/vnd.projectcaruso.naturalfamilyplaning.status";
public static final String MULTIPLE_RECORDS_MIME_TYPE = "vnd.android.cursor.dir/vnd.projectcaruso.naturalfamilyplaning.status";
StatusData statusData;
@Override
public String getType(Uri uri) {
return this.getId(uri) < 0 ? MULTIPLE_RECORDS_MIME_TYPE
: SINGLE_RECORD_MIME_TYPE;
}
@Override
public boolean onCreate() {
statusData = new StatusData(getContext());
return true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = statusData.dbHelper.getWritableDatabase();
try {
long id = db.insertOrThrow(StatusData.DATABASE_TABLE, null, values);
if (id == -1) {
throw new RuntimeException(String.format(
"%s: Failed to insert [%s] to [%s] for unknown reasons.", TAG,
values, uri));
} else {
Uri newUri = ContentUris.withAppendedId(uri, id);
// Notify the Context's ContentResolver of the change
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
}
} finally {
db.close();
}
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
long id = this.getId(uri);
int count;
SQLiteDatabase db = statusData.dbHelper.getWritableDatabase();
try {
if (id < 0) {
count = db.update(StatusData.DATABASE_TABLE, values, selection, selectionArgs);
} else {
count = db.update(StatusData.DATABASE_TABLE, values, StatusData.KEY_ROWID + "=" + id,
null);
}
} finally {
db.close();
}
// Notify the Context's ContentResolver of the change
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
long id = this.getId(uri);
int count;
SQLiteDatabase db = statusData.dbHelper.getWritableDatabase();
try {
if (id < 0) {
count = db.delete(StatusData.DATABASE_TABLE, selection, selectionArgs);
} else {
count = db.delete(StatusData.DATABASE_TABLE, StatusData.KEY_ROWID + "=" + id, null);
}
} finally {
db.close();
}
// Notify the Context's ContentResolver of the change
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
long id = this.getId(uri);
SQLiteDatabase db = statusData.dbHelper.getReadableDatabase();
Log.d(TAG, "querying");
Cursor c;
if (id < 0) {
c = db.query(StatusData.DATABASE_TABLE, projection, selection, selectionArgs,
null, null, sortOrder);
} else {
c = db.query(StatusData.DATABASE_TABLE, projection, StatusData.KEY_ROWID + "=" + id,
null, null, null, null);
}
// Notify the context's ContentResolver if the cursor result set changes
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
// Helper method to extract ID from Uri
private long getId(Uri uri) {
String lastPathSegment = uri.getLastPathSegment();
if (lastPathSegment != null) {
try {
return Long.parseLong(lastPathSegment);
} catch (NumberFormatException e) {
// at least we tried
}
}
return -1;
}
}
添加到清单中:
<application>
...
<provider android:name=".StatusProvider" android:authorities="com.projectcaruso.naturalfamilyplaning"/>
</application>
你的密码有错误
public static final Uri CONTENT_URI = Uri
.parse("content://com.projectcaruso.naturalfamilyplaning.statusprovider");
应该是
public static final Uri CONTENT_URI = Uri
.parse("content://com.projectcaruso.naturalfamilyplaning/statusprovider");
uri解析器通过“/”而不是点来解析元素。因此,无法找到提供程序,因为在您的清单中没有声明权限“com.projectcaruso.naturalfamilyplanning.statusprovider”。我认为它不会显示太多,但我可以……您能准确解释它的错误所在吗?你有错误吗?一个空的结果?还有其他问题吗?null result set表示找不到com.projectcaruso.naturalfamilyplanning.statusprovider的提供程序信息。很抱歉花了这么长时间,我可以先解决一些问题。我已经通过命令行测试了数据库,当数据库中有结果时,它现在仍然显示结果。。。。请参阅更新的logcat。好吧,现在似乎是setuplist()中的一个输入错误:您正在填充游标c,但使用游标。您的IDE支持运行时调试吗?我不知道IDE是否支持运行时调试。我怎么知道或者能够使用它呢?顺便说一句,我修正了打字错误,现在它正在努力拉记录的数量,但只在行中显示“中文本”,所以我想我只是在某处有另一个问题。。。去寻找它;)我认为这是由另一行引起的。xml与历史行我想使用IntelliJ Idea和Eclipse肯定支持调试。使用它是必须的。查看IDE的教程。。
public class StatusData {
//Database information
private static final String DATABASE_NAME = "NFP";
private static final int DATABASE_VERSION = 1;
//Table Information
static final String DATABASE_TABLE = "charting";
public static final String KEY_ROWID = "_id";
public static final String KEY_NAME = "username";
public static final String KEY_CHARTING_DATE = "Date";
public static final String KEY_CHARTING_TEMPERATURE = "temperature";
public static final String KEY_CHARTING_STAMPS = "Stamps";
public static final String KEY_CHARTING_FERTILE = "Fertile";
public static final String KEY_CHARTING_NOTES = "Notes";
public static final String KEY_CHARTING_PROC = "Proc";
private static final String GET_ALL_ORDER_BY = KEY_CHARTING_DATE + " DESC";
private static final String[] MAX_CREATED_AT_COLUMNS = { "max(" + StatusData.KEY_CHARTING_DATE + ")" };
private static final String[] DB_TEXT_COLUMNS = { KEY_CHARTING_NOTES };
//called once
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL( "CREATE table " + DATABASE_TABLE + " (" +
KEY_ROWID + " INTEGER primary key AUTOINCREMENT, " +
KEY_CHARTING_DATE + " TEXT NOT NULL, " +
KEY_NAME + " TEXT, " +
KEY_CHARTING_TEMPERATURE + " INTEGER, " +
KEY_CHARTING_STAMPS + " INTEGER, " +
KEY_CHARTING_FERTILE + " TEXT, " +
KEY_CHARTING_NOTES + " TEXT, " +
KEY_CHARTING_PROC + " ); "
);
}
final DbHelper dbHelper;
public StatusData(Context context) {
this.dbHelper = new DbHelper(context);
}
public void close() {
this.dbHelper.close();
}
public void insertOrIgnore(ContentValues values) {
SQLiteDatabase db = this.dbHelper.getWritableDatabase();
try {
db.insertWithOnConflict(DATABASE_TABLE, null, values,
SQLiteDatabase.CONFLICT_IGNORE);
} finally {
db.close();
}
}
/**
*
* @return Cursor where the columns are going to be id, created_at, user, txt
*/
public Cursor getStatusUpdates() {
SQLiteDatabase db = this.dbHelper.getReadableDatabase();
return db.query(DATABASE_TABLE, null, null, null, null, null, GET_ALL_ORDER_BY);
}
public long getLatestStatusCreatedAtTime() {
SQLiteDatabase db = this.dbHelper.getReadableDatabase();
try {
Cursor cursor = db.query(DATABASE_TABLE, MAX_CREATED_AT_COLUMNS, null, null, null,
null, null);
try {
return cursor.moveToNext() ? cursor.getLong(0) : Long.MIN_VALUE;
} finally {
cursor.close();
}
} finally {
db.close();
}
}
public String getStatusTextById(long id) {
SQLiteDatabase db = this.dbHelper.getReadableDatabase();
try {
Cursor cursor = db.query(DATABASE_TABLE, DB_TEXT_COLUMNS, KEY_ROWID + "=" + id, null,
null, null, null);
try {
return cursor.moveToNext() ? cursor.getString(0) : null;
} finally {
cursor.close();
}
} finally {
db.close();
}
}
/**
* Deletes ALL the data
*/
public void delete() {
// Open Database
SQLiteDatabase db = dbHelper.getWritableDatabase();
// Delete the data
db.delete(DATABASE_TABLE, null, null);
// Close Database
db.close();
}
}
<application>
...
<provider android:name=".StatusProvider" android:authorities="com.projectcaruso.naturalfamilyplaning"/>
</application>
05-16 21:41:20.514: E/ActivityThread(7147): Failed to find provider info for com.projectcaruso.naturalfamilyplaning.statusprovider
05-16 21:41:20.514: V/SlidingMenu(7147): changing layerType. hardware? true
05-16 21:41:20.584: D/dalvikvm(7147): GC_FOR_ALLOC freed 2595K, 8% free 3305K/3564K, paused 33ms, total 42ms
05-16 21:41:20.594: I/dalvikvm-heap(7147): Grow heap (frag case) to 4.476MB for 1188736-byte allocation
05-16 21:41:20.694: D/dalvikvm(7147): GC_CONCURRENT freed 1K, 6% free 4464K/4728K, paused 73ms+5ms, total 105ms
05-16 21:41:20.694: D/dalvikvm(7147): WAIT_FOR_CONCURRENT_GC blocked 19ms
05-16 21:41:20.744: D/dalvikvm(7147): GC_FOR_ALLOC freed <1K, 6% free 4464K/4728K, paused 30ms, total 30ms
05-16 21:41:20.754: I/dalvikvm-heap(7147): Grow heap (frag case) to 5.870MB for 1463056-byte allocation
05-16 21:41:20.864: D/dalvikvm(7147): GC_CONCURRENT freed 0K, 5% free 5893K/6160K, paused 76ms+5ms, total 107ms
05-16 21:41:20.864: D/dalvikvm(7147): WAIT_FOR_CONCURRENT_GC blocked 18ms
05-16 21:41:20.894: I/Choreographer(7147): Skipped 47 frames! The application may be doing too much work on its main thread.
05-16 21:41:20.937: V/CustomViewBehind(7147): behind INVISIBLE
05-16 21:41:21.025: V/SlidingMenu(7147): changing layerType. hardware? false
05-17 13:20:41.013: D/dalvikvm(21373): GC_CONCURRENT freed 0K, 12% free 6199K/7004K, paused 73ms+6ms, total 111ms
05-17 13:20:41.013: D/dalvikvm(21373): WAIT_FOR_CONCURRENT_GC blocked 24ms
05-17 13:20:41.054: V/SlidingMenu(21373): changing layerType. hardware? true
05-17 13:20:41.054: V/SlidingMenu(21373): changing layerType. hardware? false
05-17 13:20:41.073: I/Choreographer(21373): Skipped 54 frames! The application may be doing too much work on its main thread.
05-17 13:20:41.844: D/StatusProvider(21373): querying
05-17 13:20:41.855: I/Choreographer(21373): Skipped 39 frames! The application may be doing too much work on its main thread.
05-17 13:20:41.924: V/SlidingMenu(21373): changing layerType. hardware? true
05-17 13:20:41.984: W/CursorWrapperInner(21373): Cursor finalized without prior close()
05-17 13:20:41.984: D/dalvikvm(21373): GC_FOR_ALLOC freed 2601K, 49% free 3627K/7004K, paused 35ms, total 43ms
05-17 13:20:41.994: I/dalvikvm-heap(21373): Grow heap (frag case) to 4.791MB for 1188736-byte allocation
05-17 13:20:42.104: D/dalvikvm(21373): GC_CONCURRENT freed 23K, 32% free 4765K/7004K, paused 73ms+5ms, total 113ms
05-17 13:20:42.104: D/dalvikvm(21373): WAIT_FOR_CONCURRENT_GC blocked 35ms
05-17 13:20:42.154: D/dalvikvm(21373): GC_FOR_ALLOC freed 1K, 32% free 4764K/7004K, paused 36ms, total 36ms
05-17 13:20:42.154: I/dalvikvm-heap(21373): Grow heap (frag case) to 6.163MB for 1463056-byte allocation
05-17 13:20:42.265: D/dalvikvm(21373): GC_CONCURRENT freed 0K, 12% free 6193K/7004K, paused 74ms+5ms, total 110ms
05-17 13:20:42.265: D/dalvikvm(21373): WAIT_FOR_CONCURRENT_GC blocked 29ms
05-17 13:20:42.294: V/SlidingMenu(21373): changing layerType. hardware? true
05-17 13:20:42.294: I/Choreographer(21373): Skipped 45 frames! The application may be doing too much work on its main thread.
05-17 13:20:42.335: V/CustomViewBehind(21373): behind INVISIBLE
05-17 13:20:42.424: V/SlidingMenu(21373): changing layerType. hardware? false
public static final Uri CONTENT_URI = Uri
.parse("content://com.projectcaruso.naturalfamilyplaning.statusprovider");
public static final Uri CONTENT_URI = Uri
.parse("content://com.projectcaruso.naturalfamilyplaning/statusprovider");