3

This is my dbhelper code. I want to ask whether it is possible to support multiple language in this database? Is there a need to use google translate api or should I create another database for another language?

private DatabaseHelper dbHelper;
private SQLiteDatabase db;

private static final String K_ID = "ID";
private static final String K_NAME = "NAME";
private static final String K_BEN = "BENEFIT";
private static final String TABLE = "PLANT";

private static class DatabaseHelper extends SQLiteOpenHelper {
    DatabaseHelper(Context context) {
        super(context, "DBPLANT", null, 1);
    }

    public void onCreate(SQLiteDatabase db) {

        String sql = "CREATE TABLE " + TABLE + " (" + K_ID
                + " INTEGER PRIMARY KEY ," + K_NAME + " TEXT , " + K_BEN
                + " TEXT);";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('ALOE (Aloe Vera)','This plant has hundreds of uses, the most popular being its ability to alleviate the pain of burns and to speed their healing. Immediately immerse the burn in cold water or apply ice until the heat subsides, then generously apply the aloeAloe may also be applied to any cut or skin abrasion, and onto skin eruptions, remarkably speeding healing. To relieve the pain and itching of hemorrhoids, carve out a suppository sized chunk of the inner leaf gel and insert into the rectum.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('GARLIC (Allium sativum)','Best known for its antibiotic effect, garlic bulbs or the milder garlic greens can be eaten raw at the onset of a cold or flu. Garlic oil is effectively used for ear infections. It is easily made by finely chopping enough fresh organic garlic bulbs to fill a jelly jar, and covering them with organic olive oil.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('GINGER (Zinziber officiale)','Ginger has a carminative effect, which means that it will help relieve digestive problems which result in gas formation. It is also a diaphoretic, used both as a tea and added to a soaking bath to stimulate sweating and reduce fevers.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('COCONUT','White meat and water from the cavity are used for heart conditions, dysentery, fever, pain, and digestive and bladder problems, to quench thirst and as an aphrodisiac. To treat diarrhea, meat from young fruits is mixed with other ingredients and rubbed onto the stomach. Oil prepared from boiling coconut milk is thought of as antiseptic and soothing and so is smoothed onto the skin to treat burns, ringworm and itching.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('Carallia Brachiata','The bark was extracted with petroleum ether, ethyl acetate and methanol successively. All the extracts were screened for wound healing activity by excision and incision models in Wistar rats. The ethyl acetate and methanol extracts were found to possess significant wound healing activity. The extracts revealed the presence of sterols or triterpenoids, flavonoids, phenols, tannins, carbohydrates, fixed oils and fats.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('Ficus Hispida','The fruits are bitter, refrigerant, astringent, acrid, anti-dysenteric, anti-inflammatory, depurative, vulnerary, haemostatic and galactagogue. They are useful in ulcere, leucoderma, psoriasis, anaemia, haemorrhoids, jaundice, epistaxis, stomatorrhagia, inflammations, intermittent fever and vitiated conditions of pitta.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('Leea Indica','A decoction of the root is given in colic, is cooling and relieves thirst. In Goa, the root is much used in diarrheal and chronic dysentery. The roasted leaves are applied to the head in vertigo. The juice of the young leaves is a digestive. Plant pacifies vitiated pitta, diarrhea, dysentery, colic, ulcers, skin diseases, and vertigo.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('Mesua Ferrea','Flowers are acrid, anodyne, digestive, constipating, and stomachic. They are used in treating asthma, leprosy, cough, fever, vomiting and impotency. The seed oil pacifies vata, and also good for skin diseases and rheumatism');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('Trema Orientalis','It has been used for medicinal purposes including the treatment of respiratory, inflammatory, and helminthic diseases. Almost every part of the plant is used as medicine in various parts of Africa.');";
        db.execSQL(sql);
        sql = "INSERT INTO "
                + TABLE
                + " ("
                + K_NAME
                + ","
                + K_BEN
                + ") VALUES('Murraya Paniculata','The decoction of the leaves can be used as a gargle to treat toothache. The leaves are frequently used to treat pain due to scalding. This decoction can be given orally to treat body aches, as a tonic, and for expelling tape worm');";
        db.execSQL(sql);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE);
        onCreate(db);
    }
}

/**
 * Upgrade database
 */
public void Reset() {
    dbHelper.onUpgrade(this.db, 1, 1);
}

/**
 * Constructor
 * 
 * @param ctx
 *            the activity context
 */
public DBHelper(Context ctx) {
    dbHelper = new DatabaseHelper(ctx);
}

/**
 * Open database connection
 * 
 * @return the database connection
 * @throws SQLException
 */
public DBHelper open() throws SQLException {
    db = dbHelper.getWritableDatabase();
    return this;
}

/**
 * Close database connection
 */
public void close() {
    dbHelper.close();
}

public boolean createEntry(String name, String benefit) {
    ContentValues cv = new ContentValues();
    cv.put(K_NAME, name);
    cv.put(K_BEN, benefit);
    return db.insert(TABLE, null, cv) != -1;
}

public boolean updateEntry(String name, String benefit, String id) {
    ContentValues cv = new ContentValues();
    cv.put(K_NAME, name);
    cv.put(K_BEN, benefit);
    return db.update(TABLE, cv, K_ID + " = ?", new String[] { id }) > 0;
}

public PlantList getList() {
    PlantList plants = new PlantList();
    Cursor cur = db.rawQuery("SELECT " + K_ID + " ," + K_NAME + " FROM "
            + TABLE, null);

    if (cur.moveToFirst()) {
        do {
            plants.addData(cur.getString(cur.getColumnIndex(K_ID)),
                    cur.getString(cur.getColumnIndex(K_NAME)));
        } while (cur.moveToNext());
    }
    cur.close();
    return plants;
}

public PlantList getQuery(String query) { //search data
    PlantList plants = new PlantList();
    Cursor cur = db.rawQuery("SELECT " + K_ID + " ," + K_NAME + " FROM "
            + TABLE + " WHERE " + K_NAME + " LIKE '%" + query + "%'", null);

    if (cur.moveToFirst()) {
        do {
            plants.addData(cur.getString(cur.getColumnIndex(K_ID)),
                    cur.getString(cur.getColumnIndex(K_NAME)));
        } while (cur.moveToNext());
    }
    cur.close();
    return plants;
}

public String[] getDetail(String id) {
    String data[] = new String[2];
    Cursor cur = db.query(TABLE, new String[] { K_NAME, K_BEN }, K_ID + "="
            + id, null, null, null, null);

    if (cur.moveToFirst()) {
        data[0] = cur.getString(cur.getColumnIndex(K_NAME));
        data[1] = cur.getString(cur.getColumnIndex(K_BEN));
    }
    cur.close();
    return data;
}

public String getName(String id) {
    String name = null;
    Cursor cur = db.query(TABLE, new String[] { K_NAME }, K_ID + "=" + id,
            null, null, null, null);

    if (cur.moveToFirst()) {
        name = cur.getString(cur.getColumnIndex(K_NAME));
    }
    cur.close();
    return name;
}

public boolean deleteEntry(String id) {
    return db.delete(TABLE, K_ID + " = ?", new String[] { id }) > 0;
}

}

sudo bangbang
  • 27,127
  • 11
  • 75
  • 77
Yong Lin
  • 59
  • 7

3 Answers3

3

Yes you can use the same database SQLite always stores text data as Unicode, using the Unicode encoding specified when the database was created. The database driver itself takes care to return the data as the Unicode string in the encoding used by your language/platform.

Internally sqlite encodes all strings either in UTF-8 or UTF-16 (there is a per-database option), but since it always converts them as needed (to one or other for comparison and to/from java.lang.String in the API), you don't even need to care.

In your database table you can add different columns for the language strings for different languages and fetch data from that particular column only.

On your App you can provide the option for user to change the language. At that time you can change the column according to the chosen language and do add/edit action on that column only.

Rohit Sharma
  • 2,017
  • 1
  • 20
  • 22
  • ok. then my next question will be how i gonna write the code for changing the language in database.For my apps, the user is able to add/edit the database,If the app is at run time, when the user add on a new data, i don't know how to get the new data to translate it in another language.. – Yong Lin Jan 16 '16 at 08:18
  • you means that if one user key in "En" data which is english word, then the column(english) will collect the data, and the user can only see it in column(english) ?If the user change the "En" language to other language, the user can't see the ”En" data in other language column? – Yong Lin Jan 16 '16 at 10:17
  • That depends on your requirements. Either you can translate that and store in other columns or allow a user only to add/edit her/his language only. – Rohit Sharma Jan 16 '16 at 10:53
  • do you know the details for translating the data in database? – Yong Lin Jan 16 '16 at 11:01
  • why do you want to translate data as I clearly mentioned in answer that sqlite supports UTF format to store data. You can store any language string in it. – Rohit Sharma Jan 16 '16 at 13:52
  • Sir, can you provide some example for it?.. I am new in android ,sorry – Yong Lin Jan 16 '16 at 17:41
  • Go through this link you will get an idea how to do it: http://www.sisulizer.com/online-help/DatabaseLocalization.shtml – Rohit Sharma Jan 16 '16 at 18:13
1

Instead of creating a separate database, you're probably better off adding another column to the table indicating language and just storing the localized strings in the same table.

Owais Ali
  • 724
  • 1
  • 6
  • 14
0

It is not good practice to store data for each language in dedicated column. When you add another language you need update db schema. It is like e.g creating table for storing names and everytime when you want add to table new name you create new column for it.

Better is to create additional table that contains supported languages, and in your PLANT table add only one extra column with language Id relating to that table.
It was answered earlier that SQLite store text as Unicode, so there is not a problem to store all yours translations in one column.