2016-08-12 2 views
-1

Я разрабатываю приложение. Мне было интересно, как вы можете получить контактную информацию пользователя (имя, изображение, номер телефона, адрес) для хранения в SQLite без возможности добавления в эту базу данных?
Больше информации о единичной записи с возможностями редактирования.Информация о единичной записи для SQLite

Можете ли вы предоставить мне хорошие примеры?

+1

Только написать код для создания и редактирования отдельного объекта. – MikeT

+0

У вас есть примеры, которые я могу назвать @MikeT? –

ответ

1

Вот пример, используя 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 { 
} 

Обратите внимание, что были упомянуты Рекомендации по применению, некоторые из них не были использованы для облегчения производства этого ответа (т. Я был немного ленив).

0

Предполагая, что вам нужно только возиться с одним пользователем, вы можете сделать следующее.

  • Сделайте объект User строкой JSON с GSON.

  • Сохраните этот пользовательский класс JSON String в SharedPreference.

  • Получите пользователя JSON String из SharedPreference, когда это необходимо, и преобразуйте его из JSON String в класс User.

+0

Можете ли вы получить информацию, хранящуюся в SharedPreference, чтобы оставаться, даже если вы удаляете данные \? Мне посоветовали сделать это в sqlite. Кроме того, я в конечном итоге предоставит пользователям возможность поделиться своей информацией в приложении. –

+2

Если вы удалите данные приложения, то данные об общих предпочтениях и база данных SQLite будут удалены. Таким образом, хранение данных в общих предпочтениях не будет отличаться от хранения данных в базе данных SQLite, поскольку защита от удаления может быть удалена из-за удаления данных приложения. Есть способы иметь базу данных вне приложения, но это сложнее. – MikeT

+0

Вам совсем не нужен JSON ... Вы можете хранить каждый пользовательский ключ в качестве элемента в общих настройках –

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