【问题标题】:ListView not displaying all data in databaseListView 不显示数据库中的所有数据
【发布时间】:2015-04-04 14:52:13
【问题描述】:

我觉得这是一个菜鸟问题,我遗漏了一些明显的东西,但我刚刚习惯了 Android 编程,并且遇到了 SQLiteDatabase 和 ListView 的问题。

今天早些时候,我创建了一个 ListView,它显示来自数据库的灯具列表。我让它工作,保存并离开它。我回到它并在数据库中添加了更多的灯具,但是当我重新运行应用程序时,只有前 4 个灯具(我最初创建的那些)继续出现,而有 18 个灯具。

这里是 FixtureDB 类:

public class FixturesDB extends SQLiteOpenHelper {

//Database name
private static String dbname = "fixtureList";
//Database version
private static int version = 1;
//Primary key field
public static final String KEY_ROW_ID = "_id";
//Field which stores the fixture data
public static final String KEY_DATE = "fixture_date";
//Field which stores the fixture team
public static final String KEY_TEAM = "fixture_team";
//Field which stores the fixture competition
public static final String KEY_COMPETITION = "fixture_competition";
//Constant to store the table name
public static final String DATABASE_TABLE = "fixture_table";
//Instance variable for SQLiteDatabase
private SQLiteDatabase mDB;

//Constructor method
public FixturesDB(Context context) {
    super(context, dbname, null, version);
    this.mDB = getWritableDatabase();
}

/**
 * This method is called providing the database does not exist
 */
@Override
public void onCreate(SQLiteDatabase db) {
    String sql = "create table " + DATABASE_TABLE + " ( " + KEY_ROW_ID + " integer primary key autoincrement , "
            + KEY_DATE + " text , " + KEY_TEAM + " text , " + KEY_COMPETITION + " text ) ";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '04/02/2015', 'Bolton', 'FA Cup' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '07/02/2015', 'Everton', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '10/02/2015', 'Tottenham', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '19/02/2015', 'Besiktas', 'Europa League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '22/02/2015', 'Southampton', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '26/02/2015', 'Besiktas', 'Europa League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '01/03/2015', 'Man City', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '04/03/2015', 'Burnley', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '16/03/2015', 'Swansea', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '22/03/2015', 'Man Utd', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '04/04/2015', 'Arsenal', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '11/04/2015', 'Newcastle', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '18/04/2015', 'Hull', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '25/04/2015', 'West Brom', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '02/05/2015', 'QPR', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '09/05/2015', 'Chelsea', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '16/05/2015', 'Crystal Palace', 'Premier League' )";
    db.execSQL(sql);
    sql = "insert into " + DATABASE_TABLE + " ( " + KEY_DATE + "," + KEY_TEAM + "," + KEY_COMPETITION + " ) "
            + " values ( '24/05/2015', 'Stoke', 'Premier League' )";
    db.execSQL(sql);
}

/**
 * Returns all the fixtures in the database
 */
public Cursor getFixtures() {
    return mDB.query(DATABASE_TABLE, new String[] { KEY_ROW_ID, KEY_DATE, KEY_TEAM, KEY_COMPETITION } 
    , null, null, null, null, KEY_TEAM + " asc ");
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS" + dbname);
    onCreate(db);   
}

}

FixtureContentProvider 类:

public class FixtureContentProvider extends ContentProvider{

public static final String PROVIDER_NAME = "com.example.project.fixture";


public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/fixtures" );


private static final int fixture = 1;

private static final UriMatcher uriMatcher ;
static {
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(PROVIDER_NAME, "fixtures", fixture);
}


FixturesDB mDB;


@Override
public boolean onCreate() {
    mDB = new FixturesDB(getContext());
    return true;
}

@Override
public String getType(Uri uri) {
    return null;
}


@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

    if(uriMatcher.match(uri)==fixture){
        return mDB.getFixtures();
    }else{
        return null;
    }
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs) {
    // TODO Auto-generated method stub
    return 0;
}

}

还有 Fixtures 类:

public class Fixtures extends FragmentActivity implements LoaderCallbacks<Cursor> {

SimpleCursorAdapter mAdapter;
ListView listView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_fixtures);
    listView = (ListView) findViewById(R.id.listview);      
    mAdapter = new SimpleCursorAdapter(getBaseContext(),  R.layout.listview_fixtures_layout, null,
            new String[] {FixturesDB.KEY_DATE, FixturesDB.KEY_TEAM, FixturesDB.KEY_COMPETITION},
            new int[] {R.id.date, R.id.team, R.id.competition}, 0);
    listView.destroyDrawingCache();
    listView.setVisibility(ListView.INVISIBLE);
    listView.setVisibility(ListView.VISIBLE);
    listView.setAdapter(mAdapter);
    /**
     * This creates a loader to populate the list view from the sqlite database
     */
    getSupportLoaderManager().initLoader(0, null, this);        
}


@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
    Uri uri = FixtureContentProvider.CONTENT_URI;
    return new CursorLoader(this, uri, null, null, null, null);
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    mAdapter.swapCursor(arg1);
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    mAdapter.swapCursor(null);
}

}

我假设我必须刷新或关闭数据库然后重新打开或类似的东西?

提前致谢。

编辑 我通过简单地卸载应用程序并将其重新安装到设备来回答了我自己的问题。

菜鸟时刻。

【问题讨论】:

    标签: java android database sqlite listview


    【解决方案1】:

    从内容提供程序的存根实现来看,您似乎必须假设,如果您向 SQLiteOpenHelper 的 onCreate 方法添加更多插入语句,新行将显示在您的固定装置表中。

    事实并非如此。

    原因是 onCreate 仅在您的数据库首次创建时调用一次(文件系统上尚不存在数据库文件。)

    要绕过这个进行测试,您可以删除通常位于 /data/data/your.package.name/databases 中的数据库文件,然后重新运行您的应用程序。

    或者

    完成实现您的内容提供程序并使用 ContentResolver 或 ContentProviderClient 从某些客户端代码执行插入语句。

    或者

    使用 adb shell 并使用 sqlite3 工具将行插入数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多