2015-02-04 6 views
-1

Я чувствую, что это немного вопрос о нобе, и мне не хватает чего-то очевидного, но я просто привыкаю к ​​программированию на Android, и я столкнулся с проблемой с SQLiteDatabase и ListView ,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; 
} 

}

и класс Светильники:

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); 
} 

}

Я предполагаю, что мне нужно обновить или закрыть базу данных, затем снова открыть или что-то в этом роде?

Заранее спасибо.

Редактировать Я ответил на свой вопрос, просто отключив приложение и переустановив его на устройство.

Noob момент.

ответ

0

Судя по реализации заглушки вашего поставщика контента, кажется, вы должны предположить, что если вы добавите дополнительные инструкции insert в метод onCreate для вашего SQLiteOpenHelper, то новые строки будут отображаться в вашей таблице приборов.

Это не тот случай.

Причина заключается в том, что OnCreate вызывается только один раз, когда база данных не будет первым создал (файл базы данных на файловой системе еще существует.)

Чтобы обойти эту проблему для тестирования, вы можете удалить файл базы данных, который обычно находится в папке /data/data/your.package.name/databases, а затем повторно запускайте приложение.

Или

Завершить реализацию вашего поставщика контента и выполнять операторы вставки из некоторого кода клиента, используя ContentResolver или ContentProviderClient.

Или

Использование ADB оболочки и вставить строки в базу данных с помощью инструмента sqlite3.

Смежные вопросы