Показать существующую базу данных SQLite в приложении для Android listView - PullRequest
0 голосов
/ 04 сентября 2018

Привет всем, я пытался использовать базу данных и показать ее информацию в listView, но я не могу заставить ее работать. Вот мой класс DatabaseHelper (он расширяется от SQLiteOpenHelper):

public static String DB_PATH = "/data/data/ice.tea09.sqlitedemo/databases/";

public static String DB_NAME = "Test.sqlite";

public static final int DB_VERSION = 1;

public static final String TB_USER = "Users";

private SQLiteDatabase myDB;
private Context context;

//private String DB_PATH =context.getFilesDir().getPath();

public DatabaseHelper(Context context)
{
    super(context, DB_NAME, null, DB_VERSION);  
    this.context = context;
}

@Override
public void onCreate(SQLiteDatabase db)
{
    // TODO Auto-generated method stub

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
    // TODO Auto-generated method stub

}

@Override
public synchronized void close()
{
    if(myDB!=null)
    {
        myDB.close();
    }
    super.close();
}

public List<String> getAllUsers()
{
    List<String> listUsers = new ArrayList<String>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor c;

    try
    {
        c = db.rawQuery("SELECT * FROM " + TB_USER , null);
        if(c == null) return null;

        String name;
        c.moveToFirst();
        do
        {
            name = c.getString(1);
            listUsers.add(name);
        } while (c.moveToNext()); 
        c.close();
    }
    catch (Exception e)
    {
        Log.e("tle99", e.getMessage());
    }


    db.close();     

    return listUsers;
}


/*
 * Copy database from source code assets to device
 * @throws IOException
 */
public void copyDataBase() throws IOException
{
    try
    {
        InputStream myInput = context.getAssets().open(DB_NAME);
        String outputFileName = DB_PATH + DB_NAME;
        OutputStream myOutput = new FileOutputStream(outputFileName);

        byte[] buffer = new byte[1024];
        int length;

        while((length = myInput.read(buffer))>0)
        {
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close();
    }
    catch (Exception e)
    {
        Log.e("tle99 - copyDatabase", e.getMessage());
    }

}

/*
 * Check if the database doesn't exist on device, create new one
 * @throws IOException
 */
public void createDataBase() throws IOException
{
    boolean dbExist = checkDataBase();      

    if (dbExist)
    {

    }
    else
    {
        this.getReadableDatabase();
        try
        {
            copyDataBase();
        }
        catch (IOException e)
        {
            Log.e("tle99 - create", e.getMessage());
        }
    }
}

// ---------------------------------------------
// PRIVATE METHODS
// ---------------------------------------------

/*
 * Check if the database is exist on device or not
 * @return
 */
private boolean checkDataBase()
{
    SQLiteDatabase tempDB = null;
    try
    {
        String myPath = DB_PATH + DB_NAME;
        tempDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);
    }
    catch (SQLiteException e)
    {
        Log.e("tle99 - check", e.getMessage());
    }
    if (tempDB != null)
    {
        tempDB.close();
    }

    return tempDB != null ? true : false;
}

А это мой ActivityMain: `

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dataBaseHandler=new DataBaseHandler(this);
    try
    {
        dataBaseHandler.createDataBase();
    }

    catch (IOException e) {
        e.printStackTrace();
    }

    listViewusers=findViewById(R.id.listView);
    List<String> list=dataBaseHandler.getAllUsers();
    if(list!=null) {
        arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.activity_list_item, list);
        listViewusers.setAdapter(arrayAdapter);
    }`

У меня есть база данных в папке с активами Приложение ничего не показывает, когда оно запущено и работает Кто-нибудь может мне помочь с этим, пожалуйста, я действительно не имею ни малейшего представления.

1 Ответ

0 голосов
/ 04 сентября 2018

при первом лучше получить адрес базы данных с

@SuppressLint("SdCardPath")
private void checkDBAddress(Context context) {
    if (android.os.Build.VERSION.SDK_INT >= 17) {
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    } else {
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    }
}

в этой строке вы должны начинать с нуля, поэтому, если у вас есть только одно поле, измените его

name = c.getString(1);

до

name = c.getString(0);

наконец-то я получил исключение на вашем ArrayAdapter, если у вас та же проблема, смените адаптер на

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...