是否使用预填充数据库?对于我的Android工作室应用

时间:2016-03-23 08:44:12

标签: android database sqlite android-sqlite

我想创建一个包含引号列表(可能是1000 ++)的应用程序,每个用户都可以通过单击收藏夹按钮选择他们喜欢的引号(单击它时,它会更新数据库,以便数据库知道哪个用户偏爱的引用。)。

还有一个收藏夹活动,显示所有用户最喜欢的报价

所以我的问题是

1)我应该使用预填充数据库(使用sqlite浏览器并将其放在资产文件夹中)或创建数据库并在OnCreate方法中插入引号列表

2)如果我使用Prepopulated Database我可以更新值吗? (我希望每次用户点击最喜欢的引号时更新最喜欢的表格)因为我听说如果我把它放在资产文件夹上,它只是一个只读?

3)我应该使用哪一个来制作这款应用?我已经尝试了所有这些但仍然困惑。因为在每个教程网站上都有不同的做法

很抱歉,如果我问了一些菜鸟问题

已编辑的帖子

所以你的意思是,当我复制我从sqlite浏览器获得的.db文件时。并把它放在assets / databases文件夹中,它变成了可写的??所以我应该使用预先填充的数据库??

如果您想看

,这是我当前的代码

DatabaseOpenHelper.java

public class DatabaseOpenHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "mqn.db";
private static final int DATABASE_VERSION = 1;

private static final String TABLE_NAME = "quote";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_QUOTES = "quotesText";
public static final String COLUMN_AUTHOR= "author";
public static final String COLUMN_FAV = "fav";

private SQLiteDatabase database;

private final Context context;

// database path
private static String DATABASE_PATH;

/** constructor */
public DatabaseOpenHelper(Context ctx) {
    super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
    this.context = ctx;
    DATABASE_PATH = context.getFilesDir().getParentFile().getPath()
            + "/databases/";

}

/**
 * Creates a empty database on the system and rewrites it with your own
 * database.
 * */
public void create() throws IOException {
    boolean check = checkDataBase();

    SQLiteDatabase db_Read = null;

    // Creates empty database default system path
    db_Read = this.getWritableDatabase();
    db_Read.close();
    try {
        if (!check) {
            copyDataBase();
        }
    } catch (IOException e) {
        throw new Error("Error copying database");
    }
}

/**
 * Check if the database already exist to avoid re-copying the file each
 * time you open the application.
 *
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = DATABASE_PATH + DATABASE_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        // database does't exist yet.
    }

    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;
}

/**
 * Copies your database from your local assets-folder to the just created
 * empty database in the system folder, from where it can be accessed and
 * handled. This is done by transfering bytestream.
 * */
private void copyDataBase() throws IOException {

    // Open your local db as the input stream
    InputStream myInput = context.getAssets().open(DATABASE_NAME);

    // Path to the just created empty db
    String outFileName = DATABASE_PATH + DATABASE_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

/** open the database */
public void open() throws SQLException {
    String myPath = DATABASE_PATH + DATABASE_NAME;
    database = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READWRITE);
}

/** close the database */
@Override
public synchronized void close() {
    if (database != null)
        database.close();
    super.close();
}

// insert a user into the database
public long insertUser(String quotesText, String author, String fav) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(COLUMN_QUOTES, quotesText );
    initialValues.put(COLUMN_AUTHOR, author);
    initialValues.put(COLUMN_FAV, fav);
    return database.insert(TABLE_NAME, null, initialValues);
}

// updates a user
public boolean updateUser(long rowId, String quotesText, String author,
                          String fav) {
    ContentValues args = new ContentValues();
    args.put(COLUMN_QUOTES, quotesText);
    args.put(COLUMN_AUTHOR, author);
    args.put(COLUMN_FAV, fav);
    return database.update(TABLE_NAME, args, COLUMN_ID + "=" + rowId, null) > 0;
}

// retrieves a particular user
public Cursor getUser(long rowId) throws SQLException {
    Cursor mCursor = database.query(true, TABLE_NAME, new String[] {
                    COLUMN_ID, COLUMN_QUOTES, COLUMN_AUTHOR, COLUMN_FAV },
            COLUMN_ID + " = " + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }

    return mCursor;
}

// delete a particular user
public boolean deleteContact(long rowId) {
    return database.delete(TABLE_NAME, COLUMN_ID + "=" + rowId, null) > 0;
}

// retrieves all users
public Cursor getAllUsers() {
    return database.query(TABLE_NAME, new String[] { COLUMN_ID,
                    COLUMN_QUOTES, COLUMN_AUTHOR, COLUMN_FAV }, null, null,
            null, null, null);
}

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

}

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

}

}

QuotesActivity.java

public class QuotesActivity extends AppCompatActivity {

TextView title;
Typeface myFont;
ListView quotesList;
ListView favLV;
DatabaseOpenHelper myDbHelper;
DatabaseAccess databaseAccess;

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

    myDbHelper = new DatabaseOpenHelper(this);

    try {
        // check if database exists in app path, if not copy it from assets
        myDbHelper.create();
    } catch (IOException ioe) {
        throw new Error("Unable to create database");
    }

    try {
        // open the database
        myDbHelper.open();
        myDbHelper.getWritableDatabase();
    } catch (SQLException sqle) {
        throw sqle;
    }

    populateListView();



    Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
    toolbar.setNavigationIcon(R.drawable.back_button);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    title = (TextView) findViewById(R.id.titleQuote);
    myFont =  Typeface.createFromAsset(getAssets(), "Montserrat-Bold.otf");
    title.setTypeface(myFont);
    title.setTextSize(20);
    title.setTextColor(Color.rgb(240, 239, 223));

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

private void populateListView() {
    Cursor cursor = myDbHelper.getAllUsers();
    String[] from = new String[] {myDbHelper.COLUMN_QUOTES, myDbHelper.COLUMN_AUTHOR};
    int[] to = new int[] {R.id.quoteLV, R.id.authorLV};
    SimpleCursorAdapter myCursorAdapter;
    myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.quotes_listview, cursor, from, to,0);
    quotesList = (ListView) findViewById(R.id.quotesList);
    quotesList.setAdapter(myCursorAdapter);
}
}

Content_quotes.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="hendrasetiawan.mqn.QuotesActivity"
tools:showIn="@layout/activity_quotes">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/quotesList"
            android:layout_gravity="right"
            android:layout_weight="1" />

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/favList"
            android:layout_weight="6" />


    </LinearLayout>



</LinearLayout>
</LinearLayout>

quotes_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/quoteLV"
    android:textSize="20dp"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/authorLV"
    android:textSize="20dp"/>
</LinearLayout>

1 个答案:

答案 0 :(得分:0)

要使用预先填充的数据库,您必须将它的副本(仅第一次运行,即数据库尚未存在于正确的路径中)复制到标准数据库文件夹中。

一旦那里,您的数据库就会变得可写,因为您不再使用assets文件夹中的副本。