- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图从我的 SQLite 数据库中提取我的数据并将其显示在 ListView 中,这是我目前所拥有的,但它只将第一条记录放在 ListView 中。我认为“while (mCursor.moveToNext()){”位需要更改但不确定如何更改。原始代码每次都将每条记录放在新行的 TextView 中。
if (mCursor == null){
mCursor.close();
Log.w("cursor", "null cursor");
}
mCursor.moveToFirst();
String[] s = null;
while (mCursor.moveToNext()){
s = new String[] { foodNameColumn, proteinColumn, fatColumn, carbsColumn };
mCursor.moveToNext();
}
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.aa_four_column,
mCursor,
s,
new int[] { R.id.txtCol1, R.id.txtCol2, R.id.txtCol3, R.id.txtCol4 }, 0);
lvDB.setAdapter(adapter);
更新:
我已经更改了它,所以只有这段代码在 onCreate 方法中,但是同样的事情发生了,当数据库中有多个东西时显示一个项目。
mCursor = dataBase.select("SELECT * FROM " + TABLE_NAME);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.aa_four_column,
mCursor,
new String[] { foodNameColumn, proteinColumn, fatColumn, carbsColumn },
new int[] { R.id.txtCol1, R.id.txtCol2, R.id.txtCol3, R.id.txtCol4 }, 0);
lvDB.setAdapter(adapter);
aa_column_four.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/txtCol1"
android:layout_width="181dp"
android:layout_height="wrap_content"
android:text="Column 1 text will end up here!" />
<TextView
android:id="@+id/txtCol2"
android:layout_width="63dp"
android:layout_height="wrap_content"
android:text="Column 2 text will end up here!" />
<TextView
android:id="@+id/txtCol3"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:text="Column 3 text will end up here!" />
<TextView
android:id="@+id/txtCol4"
android:layout_width="104dp"
android:layout_height="wrap_content"
android:text="Column 4 text will end up here!" />
</LinearLayout>
DatabaseManager 类
public class DataBaseManager extends SQLiteOpenHelper {
//the MAIN package of your project
private static String DB_PATH = "/data/data/com.example.activities/databases/";
//the name of your database
private static String DB_NAME = "DB_Nutrition";
private static SQLiteDatabase mDataBase;
private static DataBaseManager sInstance = null;
// database version
private static final int DATABASE_VERSION = 1;
/**
* Constructor Takes and keeps a reference of the passed context in order to
* access to the application assets and resources.
*/
DataBaseManager() {
super(ApplicationContextProvider.getContext(), DB_NAME, null, DATABASE_VERSION);
try {
createDataBase();
openDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Singleton for DataBase
*
* @return singleton instance
*/
public static DataBaseManager instance() {
if (sInstance == null) {
sInstance = new DataBaseManager();
}
return sInstance;
}
/**
* Creates a empty database on the system and rewrites it with your own
* database.
*
* @throws java.io.IOException io exception
*/
private void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
// do nothing - database already exist
} else {
// By calling this method an empty database will be created into
// the default system path
// of your application so we are gonna be able to overwrite that
// database with our database.
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
/**
* Check if the database already exist to avoid re-copying the file each
* time you open the application.
*
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
// database doesn't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null;
}
/**
* Copies your database from your local assets-folder to the just created
* empty database in the system folder, from where it can be accessed and
* handled. This is done by transfering bytestream.
*
* @throws java.io.IOException io exception
*/
public void copyDataBase() throws IOException {
// Open your local db as the input stream
InputStream myInput = ApplicationContextProvider.getContext().getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
private void openDataBase() throws SQLException {
// Open the database
String myPath = DB_PATH + DB_NAME;
mDataBase = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
/**
* Select method
*
* @param query select query
* @return - Cursor with the results
* @throws android.database.SQLException sql exception
*/
public Cursor select(String query) throws SQLException {
return mDataBase.rawQuery(query, null);
}
/**
* Insert method
*
* @param table - name of the table
* @param values values to insert
* @throws android.database.SQLException sql exception
*/
public void insert(String table, ContentValues values) throws SQLException {
mDataBase.insert(table, null, values);
}
/**
* Delete method
*
* @param table - table name
* @param where WHERE clause, if pass null, all the rows will be deleted
* @throws android.database.SQLException sql exception
*/
public void delete(String table, String where) throws SQLException {
mDataBase.delete(table, where, null);
}
/**
* Update method
*
* @param table - table name
* @param values - values to update
* @param where - WHERE clause, if pass null, all rows will be updated
*/
public void update(String table, ContentValues values, String where) {
mDataBase.update(table, values, where, null);
}
/**
* Let you make a raw query
*
* @param command - the sql comand you want to run
*/
public void sqlCommand(String command) {
mDataBase.execSQL(command);
}
@Override
public synchronized void close() {
if (mDataBase != null)
mDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
错误
03-03 15:42:13.894: E/SQLiteLog(9809): (14) cannot open file at line 30176 of [00bb9c9ce4]
03-03 15:42:13.894: E/SQLiteLog(9809): (14) os_unix.c:30176: (2) open(/data/data/com.example.activities/databases/DB_Nutrition) -
03-03 15:42:13.904: E/SQLiteDatabase(9809): Failed to open database '/data/data/com.example.activities/databases/DB_Nutrition'.
03-03 15:42:13.904: E/SQLiteDatabase(9809): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at com.example.db_food.DataBaseManager.checkDataBase(DataBaseManager.java:228)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at com.example.db_food.DataBaseManager.createDataBase(DataBaseManager.java:193)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at com.example.db_food.DataBaseManager.<init>(DataBaseManager.java:163)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at com.example.db_food.DataBaseManager.instance(DataBaseManager.java:179)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at com.example.db_food.MyActivity.onCreate(MyActivity.java:63)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.app.Activity.performCreate(Activity.java:5104)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.os.Looper.loop(Looper.java:137)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at java.lang.reflect.Method.invokeNative(Native Method)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at java.lang.reflect.Method.invoke(Method.java:511)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-03 15:42:13.904: E/SQLiteDatabase(9809): at dalvik.system.NativeStart.main(Native Method)
最佳答案
看起来你想在 ListView 中显示表格中的数据,所以只需创建一个适配器:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.aa_four_column,
mCursor,
new String[] { foodNameColumn, proteinColumn, fatColumn, carbsColumn },
new int[] { R.id.txtCol1, R.id.txtCol2, R.id.txtCol3, R.id.txtCol4 }, 0);
lvDB.setAdapter(adapter);
(单独使用此代码,您不需要使用下面的任何其他代码,但您应该阅读它以了解为什么您的大部分代码不会执行您尝试执行的操作。)
你有一些逻辑错误。
1) 如果一个对象是null
,你不能引用它的任何方法:
if (mCursor == null){
/* mCursor.close(); This will throw an NullPointerException! */
Log.w("cursor", "null cursor");
return;
}
2) 在读取一行之前调用moveToFirst()
和 moveToNext()
可以跳过第一条记录。此外,您在两次读取记录之间调用了 moveToNext()
,因此您只是每隔一个读取一次。试试这个:
while (mCursor.moveToNext()){
// Do something
}
3) 现在要手动从 Cursor 读取实际值,您必须使用类似 getString()
或 getInt()
的方法:
List<String> strings = new ArralyList<String>();
while (mCursor.moveToNext()){
strings.add(mCursor.getString(mCursor.getColumnIndex(foodNameColumn)) + " " + mCursor.getInt(mCursor.getColumnIndex(proteinColumn)));
}
4) 在原始循环中,您没有向 s
添加任何数据。您只是用相同的值一遍又一遍地覆盖 s
:
while (mCursor.moveToNext()){
s = new String[] { foodNameColumn, proteinColumn, fatColumn, carbsColumn };
}
不管这个循环执行一次还是一千次,s
总是一样的。
关于Android:将数据从数据库绑定(bind)到 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178956/
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!