Основной принцип извлечения и последующего использования данных, хранящихся в базе данных SQLite на устройстве Android, заключается в использовании / выполнении запроса до SELECT , доступного через Курсор , а затем переместите в пределах Курсора в соответствующую строку или строки и, наконец, извлеките данные из соответствующего столбца или столбцов.
Для вашей конкретной проблемыВы хотите найти последнюю вставленную строку, и, к счастью, SQLite имеет функцию, которая помогает, то есть last_insert_rowid()
Так что запрос будет SELECT * FROM Account WHERE rowid = last_insert_rowid()
Поскольку существуют различные проблемы скод, который вы предоставили.Ниже приведен пример, основанный на вашем коде, который будет: -
- Добавить новую учетную запись (хотя и очень простую с одним именем), а затем
Извлеките имя последней учетной записи, которая была добавлена (хотя, как вы знаете, это имя не очень полезно).
- Обратите внимание, что это очень ограниченно, но показывает технику.
- Примечание. Rowid - это специальный столбец, который по умолчанию предоставляется для каждой строки (таблица без ROWID не будет иметь rowid). rowid однозначно идентифицирует строку и представляет собой целое число вначале 1, затем, вероятно, 2, а затем, вероятно, 3 ....... НО на него никогда не следует полагать, что оно монотонно увеличивается.
Первый очень простой AccountInfo
класс, а именно AccountInfo.java (который у вас уже есть: -
public class AccountInfo {
private String mAccountName;
public AccountInfo(String account_name) {
this.mAccountName = account_name;
}
public String getAcctName() {
return mAccountName;
}
}
Второй DBHelper.java (примечаниекомментарии, также не то, насколько они похожи на ваш): -
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME="accountDB.db";
private static final String DATABASE_TABLE="Account";
private static final String COL1="AccountName"; //<<<< not used
private static final String COL2="Time"; //<<<< not used
public DBHelper(Context context){ //<<<< modifed to include the Context to be passed
super(context, DATABASE_NAME, null, 1);
}
//<<<<<<<<<< This is superfluous and isn't used in this example >>>>>>>>>>
//<<<<<<<<<< It could be deleted >>>>>>>>>>
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table Account(acctname text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
this.onCreate(db);
}
public void insertRecord(AccountInfo a){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contents = new ContentValues();
//contents.put("AccountName", a.getAcctName()); //<<<< Will fail as incorrect column name
contents.put("acctname",a.getAcctName()); //<<<< column name as per table definition
db.insert(DATABASE_TABLE,null,contents); //<<<< ADDED to do the insert itself
}
//<<<<<<<<<< The Query that gets the name of the account last added >>>>>>>>>>
public String getLastInsertedAccountName() {
String rv = ""; //<<<< Just in case nothing is extracted set the return value to empty String
String[] columns = new String[]{"acctname"}; //<<<< The columns to extract (only one)
String whereclause = "rowid = last_insert_rowid()"; //<<<< The SQL WHERE clause (less the WHERE keyword)
SQLiteDatabase db = this.getWritableDatabase();//<<<< Get the SQLite database
// Use the SQLliteDatabase convenience query method that gets the data into a Cursor
Cursor csr = db.query(
DATABASE_TABLE, //<<<< The table to be queried (ie FROM )
columns, //<<<< The columns to be returned just one (could use null to return all columns)
whereclause, //<<<< The WHERE clause
null, //<<<< selection args (none so null)
null, //<<<< the column(s) to GROUP BY (none so null)
null, //<<<< The having clause (none so null)
null //<<<< The ORDER BY clause (none so null)
);
//<<<< Move to the first (only) row in the Cursor (if there is one)
if (csr.moveToFirst()) {
// Get the value, as a string, from the column name acctname
rv = csr.getString(
csr.getColumnIndex(
"acctname"
)
);
}
csr.close(); //<<<< Close the Cursor as done with it
return rv; //<<<< Finally retruned that extracted value
}
}
Код вызова в действии, MainActivity (очень просто): -
открытый классMainActivity расширяет AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBHelper mDBHlpr = new DBHelper(this); //<<<< Get an instance of the DBHelper
AccountInfo c = new AccountInfo("Fred"); //<<<< Create an Account to add
mDBHlpr.insertRecord(c);
//<<<<<<<<<< one line version of the two lines above (commented out) <<<<<<<<<<
//mDBHlpr.insertRecord(new AccountInfo("Tom"));
String account_just_inserted = mDBHlpr.getLastInsertedAccountName(); //<<<< get the name
//<<<<<<<<<< Do something with the name i.e. write it out to the Log >>>>>>>>>>
Log.d(
"ACCOUNT INSERTED",
"The Name of the account just inserted is :-" +
account_just_inserted
);
}
}
- Примечание при каждом запуске приложения будет добавляться новая строка с именем Фреда в качестве имени учетной записи.
Результат
при выполнении вышеуказанного выдает что-то похожее на: -
05-24 09:27:14.215 1287-1287/acnta.accountapp D/ACCOUNT INSERTED: The Name of the account just inserted is :-Fred