Вот пример, используя SQLite, создание базы данных с одной таблицей и одной строкой.
Существует два основных компонента. Код в действии вашего приложения и класс DBHelper.
Первый класс DBHelper: -
package your.package;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Mike092015 on 13/08/2016.
*/
public class MyDBHelper extends SQLiteOpenHelper {
// A few variables
public static final String DATABASE_NAME = "MYDB";
public static final int DATABASE_VERSION = 1;
// The Database Constructor
public MyDBHelper(Context ctxt, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(ctxt, DATABASE_NAME, factory, DATABASE_VERSION); }
@Override
public void onCreate(SQLiteDatabase db) {
String sqlstr = "CREATE TABLE IF NOT EXISTS MYUSERTABLE (_id INTEGER PRIMARY KEY, " +
"NAME TEXT NOT NULL, " +
"PICTURE TEXT, " +
"PHONE_NUMBER TEXT, " +
"ADDRESS TEXT);";
db.execSQL(sqlstr);
sqlstr = "INSERT INTO MYUSERTABLE (_id, NAME, PICTURE, PHONE_NUMBER, ADDRESS) " +
"VALUES('0','MYNAME','MYPICTURE_LINK','00 0000 0000','NONE');";
db.execSQL(sqlstr);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
//DO NOTHING
}
public Cursor getUserAsCursor() {
String sqlstr = "SELECT * FROM MYUSERTABLE;";
SQLiteDatabase db = this.getReadableDatabase();
return db.rawQuery(sqlstr,null);
}
}
Создание экземпляра MyDBHelper создаст базу данных, если она не существует (при попытке открыть базу данных с помощью getReadableDatabase()
или getWritableDatabase()
) и вызывает onCreate
метод, который должен быть вызван, где таблица создана и заполнена одной строкой. Если база данных уже существует, то onCreate
не будет вызываться, поэтому таблица не будет затронута. Обратите внимание, что экземпляр будет создан в другом действии (см. Ниже).
Если номер версии увеличен, то будет вызван метод onUpgrade
(я сделал это, чтобы он ничего не делал (лично я не использую это, скорее, я использую метод, который создает схему psuedo в соответствии со значениями, которые это затем сравнивается с фактической схемой, а затем добавляются дополнительные таблицы/строки)). Однако не беспокойтесь о onUpgrade в настоящее время. Просто удалите данные приложения, чтобы начать заново.
Был введен метод, а именно getUserAsCursor
, который вернет курсор SQLite (массив строк с столбцами в качестве элементов). Это используется в вызывающей активности.
Второй код является то, что вызывающая активность и: -
package your.package;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class Main extends AppCompatActivity {
public MyDBHelper myDBHelper = new MyDBHelper(this,null,null,1);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
Cursor csr = myDBHelper.getUserAsCursor();
Toast.makeText(this,"Cursor Count returns " + csr.getCount() +
"\nNumber of Columns is " + csr.getColumnCount(),
Toast.LENGTH_LONG).show();
csr.moveToFirst();
if(csr.getCount() > 0) {
Toast.makeText(this,"Name==> " + csr.getString(1) + "\n" +
"Picture==> " + csr.getString(2) + "\n" +
"Phone Number==> " + csr.getString(3) + "\n" +
"Address===> " + csr.getString(4),Toast.LENGTH_LONG).show();
}
else {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
myDBHelper.close();
}
}
аспекты соответствующего кода являются: -
public MyDBHelper myDBHelper = new MyDBHelper(this,null,null,1);
Создание экземпляра базы данных. Это, как было сказано ранее, создает базу данных и таблицу, которые она заполняет, только если база данных не существует.
Cursor csr = myDBHelper.getUserAsCursor();
Это вызывает getUserAsCursor
метод, возвращающий курсор, который содержит все столбцы всех строк из таблицы.В соответствии с SQL-запросом SELECT * FROM MYUSERTABLE;
(Выберите все столбцы из таблицы MYUSERTABLE).
Toast.makeText(this,"Cursor Count returns " + csr.getCount() +
"\nNumber of Columns is " + csr.getColumnCount(),
Toast.LENGTH_LONG).show();
Отладочная информация. Он генерирует тост, который говорит, сколько строк и столбцов содержится в курсоре возврата.
csr.moveToFirst();
Это переходит к первой строке данных/(я не уверен, что этот термин, но курсор находится первоначально в заголовке, пытаясь получить доступ к этому, если бы это была строка приведет к «OutofBounds ').
if(csr.getCount() > 0) {
Toast.makeText(this,"Name==> " + csr.getString(1) + "\n" +
"Picture==> " + csr.getString(2) + "\n" +
"Phone Number==> " + csr.getString(3) + "\n" +
"Address===> " + csr.getString(4),Toast.LENGTH_LONG).show();
}
Этот доступ к данным из столбцов в строке и выдает тост, отображающий данные. Как вы видите, он использует метод getString курсора, который принимает индекс строки (начиная с 0).
Возможно, вы задавались вопросом, почему я включил _id в качестве столбца в таблице. Это связано с тем, что некоторые вещи, такие как cursorAdapters
(используется ListViews
), ожидают такой столбец.
В связи с обновлением пользователя. Вот пример того, как это можно достичь. Этот рудиментарный пример добавляет еще один метод upDateUser
к DBHelper согласно: -
public void upDateUser(String newname, String newpicture, String newphonenumber, String newaddress) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("NAME",newname);
cv.put("PICTURE",newpicture);
String where = "_id = ? ";
String[] whereargs = new String[] {String.valueOf(0)};
db.update("MYUSERTABLE", cv, where, whereargs);
db.close();
}
Примечание вы можете использовать запрос, чтобы сделать то же самое через db.execSQL. Тем не менее, использование contentValues и метод обновления считается лучшей практикой (я считаю)
Это затем вызывается из деятельности с помощью (после кода выше): -
myDBHelper.upDateUser("Fred", "A NEW PICTURE", "11 1111 1111","0 NOWHERE TOWN");
К тому времени копирования в следующий код (как ранее использовался), будет отображаться измененная/обновленная запись (обратите внимание, что в этом случае в этом случае будут отображаться только изменения в первом запуске после создания базы данных/таблицы/строки, последующие прогоны будут отображаться одинаково данные): -
csr = myDBHelper.getUserAsCursor(); // get DB cursor via getUserAsCursor method
Toast.makeText(this,"Cursor Count returns " + csr.getCount() +
"\nNumber of Columns is " + csr.getColumnCount(),
Toast.LENGTH_LONG).show(); // Show, via toast, # of rows and # of columns
csr.moveToFirst();
if(csr.getCount() > 0) {
Toast.makeText(this,"Name==> " + csr.getString(1) + "\n" +
"Picture==> " + csr.getString(2) + "\n" +
"Phone Number==> " + csr.getString(3) + "\n" +
"Address===> " + csr.getString(4),Toast.LENGTH_LONG).show();
}
else {
}
Обратите внимание, что были упомянуты Рекомендации по применению, некоторые из них не были использованы для облегчения производства этого ответа (т. Я был немного ленив).
Только написать код для создания и редактирования отдельного объекта. – MikeT
У вас есть примеры, которые я могу назвать @MikeT? –