我有一个包含 4 个字段的 excel 文件,我想在首次使用模拟器时用来填充数据库。以前,我曾经将数据库文件直接存储在手机上,但如果在创建时填充这些项目会更容易。如何在模拟器启动时从 excel 文件或文本文件中读取并填充数据库?
假设电子表格如下:-
已使用文件资源管理器将其保存为名为Book1.csv的CSV文件到应用程序的资产文件夹(如果需要,创建名为 assets 的文件夹)例如
IE D:\Android_Applications\LoadDataFromExcel\app\src\main\assets
和一个 DatabaseHelper(即 SQLiteOpenHelper 的子类),如下所示:-
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String MYDATA_TBL = "mydata";
public static final String MYDATA_ID_COL = "_id";
public static final String MYDATA_NAME_COL = "_name";
public static final String MYDATA_AMOUNT_COL = "_amount";
public static final String MYDATA_DATE_COL = "_date";
public static final String MYDATA_DESCRIPTION_COL = "_description";
private static final String TBLCREATESQL =
"CREATE TABLE " + MYDATA_TBL +
"(" +
MYDATA_ID_COL + " INTEGER PRIMARY KEY," +
MYDATA_NAME_COL + " TEXT," +
MYDATA_AMOUNT_COL + " INTEGER," +
MYDATA_DATE_COL + " TEXT, " +
MYDATA_DESCRIPTION_COL + " TEXT" +
")";
private SQLiteDatabase mDB;
public DatabaseHelper(Context ccontext) {
super(ccontext, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TBLCREATESQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long insertRow(String name, int amount, String date, String description) {
ContentValues cv = new ContentValues();
cv.put(MYDATA_NAME_COL,name);
cv.put(MYDATA_AMOUNT_COL,amount);
cv.put(MYDATA_DATE_COL,date);
cv.put(MYDATA_DESCRIPTION_COL,description);
return mDB.insert(MYDATA_TBL,null,cv);
}
}
然后你可以有一些基于:-
public class MainActivity extends AppCompatActivity {
DatabaseHelper dbh;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbh = new DatabaseHelper(this);
loadExternalData();
}
private void loadExternalData() {
InputStream importdata;
BufferedReader br;
String line;
String[] splitdata;
int linecount = 0;
final String tag = "loadExternalData";
try {
importdata = this.getAssets().open("Book1.csv");
} catch (IOException e) {
Log.d(tag,"Error opening asset file");
return;
}
br = new BufferedReader(new InputStreamReader(importdata));
try {
while ( (line = br.readLine()) != null) {
// Skip column headings
if (linecount++ > 0) {
splitdata = line.split(",");
dbh.insertRow(
splitdata[0],
new Integer(splitdata[1]),
splitdata[2],
splitdata[3]
);
}
}
} catch (IOException e) {
Log.d(tag,"IO Error reading data at line " + (linecount + 1));
e.printStackTrace();
}
}
}
笔记!这是非常基本的,而是一个原则性的演示,例如它不会处理数据中的逗号,并且每次运行它都会创建一组新的行
1) 向 DatabaseHelper 类添加新方法:-
public boolean ifRowExists(String name, int amount, String date, String description) {
Cursor csr = mDB.query(MYDATA_TBL,null,
MYDATA_NAME_COL + "=? AND " +
MYDATA_AMOUNT_COL + "=? AND " +
MYDATA_DATE_COL + "=? AND " +
MYDATA_DESCRIPTION_COL + "=?",
new String[]{name,Integer.toString(amount), date, description},
null,null,null
);
boolean rv = csr.getCount() > 0;
csr.close();
return rv;
}
2) 修改loadExternalData
调用类中的方法以检查被插入的行是否存在:-
private void loadExternalData() {
InputStream importdata;
BufferedReader br;
String line;
String[] splitdata;
int linecount = 0;
final String tag = "loadExternalData";
try {
importdata = this.getAssets().open("Book1.csv");
} catch (IOException e) {
Log.d(tag,"Error opening asset file");
return;
}
br = new BufferedReader(new InputStreamReader(importdata));
try {
while ( (line = br.readLine()) != null) {
// Skip column headings
if (linecount++ > 0) {
splitdata = line.split(",");
if (!dbh.ifRowExists(splitdata[0], new Integer(splitdata[1]), splitdata[2], splitdata[3])) {
dbh.insertRow(
splitdata[0],
new Integer(splitdata[1]),
splitdata[2],
splitdata[3]
);
}
}
}
} catch (IOException e) {
Log.d(tag,"IO Error reading data at line " + (linecount + 1));
e.printStackTrace();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句