Android SQLiteDatabase 从顶部开始
Android SQLiteDatabase at item from top
我希望所有新项目都添加到顶部,即如果 ROW-ID 1,2,3 被占用并且我添加一个新项目,它应该被添加到位置 1,其余的应该是转移。但是现在当我添加一个项目时,它被添加到 ID 4(即在后面)。
方法
Temp_Cover_StoryBaseList_DatabaseHandler db = new Temp_Cover_StoryBaseList_DatabaseHandler(context, currentUsername);
db.addStory(pointer, filePath);
db.close();
_
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db)
{
String CREATE_STORIES_TABLE
= "CREATE TABLE " + TABLE_TEMP_BASESTORY_LIST
+ "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_POINTER + " STRING,"
+ KEY_URI + " STRING"
+ ")";
db.execSQL(CREATE_STORIES_TABLE);
}
_
// Adding new Story
public void addStory(String pointer, String filePath)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_POINTER, pointer );
values.put(KEY_URI, filePath );
// Inserting Row
long id = db.insert(TABLE_TEMP_BASESTORY_LIST, null, values);
Log.d(TAG, "TempCover ID:" + Long.toString(id));
db.close();
}
_
public List<StoryData> getAllStories()
{
List<StoryData> storyDataList = new ArrayList<StoryData>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_STORIES_LIST;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if(cursor !=null)
{
if (cursor.moveToFirst())
{
do
{
ArrayList<Integer> coverList = new ArrayList<Integer>();
coverList.add( cursor.getInt(4) );
coverList.add( cursor.getInt(5) );
StoryData sData = new StoryData
(
cursor.getInt(0),
cursor.getString(1),
cursor.getString(2),
cursor.getInt(3),
coverList,
Long.parseLong(cursor.getString(6)),
Boolean.parseBoolean(cursor.getString(7)),
cursor.getString(8)
);
// Adding contact to list
storyDataList.add(sData);
} while (cursor.moveToNext());
}
}
return storyDataList;
}
您似乎正在尝试更改 SQL 行的自动增量 ID。这是在您创建新行时自动设置的。您不能或至少不应该设置自动增量 ID 或取决于 table.
中行的物理顺序
最好创建一个单独的列,将所需的行顺序包含为整数。然后,当您查询 table 时,您可以根据该列中的整数对行进行排序。
您可以添加如下所示的列:
@Override
public void onCreate(SQLiteDatabase db)
{
String CREATE_STORIES_TABLE
= "CREATE TABLE " + TABLE_TEMP_BASESTORY_LIST
+ "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_POINTER + " STRING,"
+ KEY_URI + " STRING,"
+ KEY_ORDER + " INTEGER"
+ ")";
db.execSQL(CREATE_STORIES_TABLE);
}
现在在插入项目时添加订单。每次插入一行时只需增加 order 的值:
ContentValues values = new ContentValues();
values.put(KEY_POINTER, pointer );
values.put(KEY_URI, filePath );
values.put(KEY_ORDER, order );
// Inserting Row
long id = db.insert(TABLE_TEMP_BASESTORY_LIST, null, values);
简单地说,你不能这样做,
直接使用 Collections.reverse(storyDataList);
可能行不通
我建议获取所有数据并使用 ID
对其进行排序,例如使用 Comparable 并创建自定义 class 进行排序,例如
public class SortDataCompare implements Comparator<StoryData> {
@Override
public int compare(StoryData s1, StoryData s2) {
return s1.getId().compareTo(s2.getId());
}
}
并使用class喜欢
Collections.sort(storyDataList, new SortDataCompare());
然后你的 storyDataList
将被排序。
我希望所有新项目都添加到顶部,即如果 ROW-ID 1,2,3 被占用并且我添加一个新项目,它应该被添加到位置 1,其余的应该是转移。但是现在当我添加一个项目时,它被添加到 ID 4(即在后面)。
方法
Temp_Cover_StoryBaseList_DatabaseHandler db = new Temp_Cover_StoryBaseList_DatabaseHandler(context, currentUsername);
db.addStory(pointer, filePath);
db.close();
_
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db)
{
String CREATE_STORIES_TABLE
= "CREATE TABLE " + TABLE_TEMP_BASESTORY_LIST
+ "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_POINTER + " STRING,"
+ KEY_URI + " STRING"
+ ")";
db.execSQL(CREATE_STORIES_TABLE);
}
_
// Adding new Story
public void addStory(String pointer, String filePath)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_POINTER, pointer );
values.put(KEY_URI, filePath );
// Inserting Row
long id = db.insert(TABLE_TEMP_BASESTORY_LIST, null, values);
Log.d(TAG, "TempCover ID:" + Long.toString(id));
db.close();
}
_
public List<StoryData> getAllStories()
{
List<StoryData> storyDataList = new ArrayList<StoryData>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_STORIES_LIST;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if(cursor !=null)
{
if (cursor.moveToFirst())
{
do
{
ArrayList<Integer> coverList = new ArrayList<Integer>();
coverList.add( cursor.getInt(4) );
coverList.add( cursor.getInt(5) );
StoryData sData = new StoryData
(
cursor.getInt(0),
cursor.getString(1),
cursor.getString(2),
cursor.getInt(3),
coverList,
Long.parseLong(cursor.getString(6)),
Boolean.parseBoolean(cursor.getString(7)),
cursor.getString(8)
);
// Adding contact to list
storyDataList.add(sData);
} while (cursor.moveToNext());
}
}
return storyDataList;
}
您似乎正在尝试更改 SQL 行的自动增量 ID。这是在您创建新行时自动设置的。您不能或至少不应该设置自动增量 ID 或取决于 table.
中行的物理顺序最好创建一个单独的列,将所需的行顺序包含为整数。然后,当您查询 table 时,您可以根据该列中的整数对行进行排序。
您可以添加如下所示的列:
@Override
public void onCreate(SQLiteDatabase db)
{
String CREATE_STORIES_TABLE
= "CREATE TABLE " + TABLE_TEMP_BASESTORY_LIST
+ "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_POINTER + " STRING,"
+ KEY_URI + " STRING,"
+ KEY_ORDER + " INTEGER"
+ ")";
db.execSQL(CREATE_STORIES_TABLE);
}
现在在插入项目时添加订单。每次插入一行时只需增加 order 的值:
ContentValues values = new ContentValues();
values.put(KEY_POINTER, pointer );
values.put(KEY_URI, filePath );
values.put(KEY_ORDER, order );
// Inserting Row
long id = db.insert(TABLE_TEMP_BASESTORY_LIST, null, values);
简单地说,你不能这样做,
直接使用 Collections.reverse(storyDataList);
可能行不通
我建议获取所有数据并使用 ID
对其进行排序,例如使用 Comparable 并创建自定义 class 进行排序,例如
public class SortDataCompare implements Comparator<StoryData> {
@Override
public int compare(StoryData s1, StoryData s2) {
return s1.getId().compareTo(s2.getId());
}
}
并使用class喜欢
Collections.sort(storyDataList, new SortDataCompare());
然后你的 storyDataList
将被排序。