Android 使用XML填充SQLite并集成内部活动
从我找到的所有教程(包括Stackoverflow中的答案)中,我找不到一个完整的教程来展示如何实现XML到SQLite的填充。 我创建了一个DB助手,但我不知道如何将其集成到我的活动中。我想做的是;一旦应用程序启动,它就应该用XML填充数据库 XML 我在“res\XML”文件夹中有一个XML文件“amawal\u posts.XML”,其中包含一些我想在数据库中填充的条目Android 使用XML填充SQLite并集成内部活动,android,xml,eclipse,sqlite,android-activity,Android,Xml,Eclipse,Sqlite,Android Activity,从我找到的所有教程(包括Stackoverflow中的答案)中,我找不到一个完整的教程来展示如何实现XML到SQLite的填充。 我创建了一个DB助手,但我不知道如何将其集成到我的活动中。我想做的是;一旦应用程序启动,它就应该用XML填充数据库 XML 我在“res\XML”文件夹中有一个XML文件“amawal\u posts.XML”,其中包含一些我想在数据库中填充的条目 <?xml version="1.0" encoding="utf-8"?> <database na
<?xml version="1.0" encoding="utf-8"?>
<database name="npma_amawal" >
<!-- Table wp_posts -->
<table name="wp_posts" >
<column name="ID" >948</column>
<column name="post_content" >اورغ</column>
<column name="post_title" >ure</column>
</table>
<table name="wp_posts" >
<column name="ID" >46</column>
<column name="post_content" >adlis g llan iwaliwn FR: dictionnaire.</column>
<column name="post_title" >amawal</column>
</table>
</database>
我的主要活动
“MainActivity.java”的内容
作为Java编程的初学者,活动/布局/服务之间有着密切的关系。。有点难以理解:(
问题:如何在我的活动中调用/执行此方法?
createDataBase()
方法应在XMLtoSQLite
类的onCreate()方法中调用。您不应将它们放在xml文件中
理由一:为了演出
理由二:为了代码的清晰
有用链接:
架构示例:
表示单个表的AnObject.java文件(onCreate和onUpdate方法应在此处自定义实现,toString(),…)
管理该表的AnObjectManger.java文件,执行请求。。
AnOpenHelperDataBase.java,简化sqlite的使用并执行基本操作
请注意,要创建数据库,您只需要以下示例:
public DatabaseOpenHelper(Context context, CursorFactory factory) {
super(context, DATA_BASE_NAME, factory, DATABASE_VERSION);
}
编辑:
如果你仍然想保持你的方法,这里是操作顺序
1-下载数据
2-创建de数据库,表为空
3-填写表格
4-在一个简单的缓存中获取所需的数据(列表、HashMap、ArrayList等)
5-在需要时显示/使用这些数据(如果可用)
请注意:
1-下载应在另一个线程中完成(线程、异步任务、服务…)
2-对数据库的操作通常也应该在另一个线程中完成我认为最好的方法是遵循一些有用的指南。让我们将问题分成更简单的部分:
数据库
依我看,您必须很好地创建数据库类,所以请遵循;它非常有用,并详细解释了有关数据库的所有内容
从web下载数据
将来(参见上面的注释)您需要从web下载数据,所以使用AsyncTask类连接到站点,然后下载所有需要的数据;如果您不知道这个类,请阅读此内容
解析XML
您必须解析XML:您可以使用,或。我使用DocumentBuilder,但我的XML文件与您的不同:
...
String errorCode = null;
Document changes;
try {
// URL were lies some xml-data
URL url = new URL(params[0]);
// Creating a document
InputSource is = new InputSource(url.openStream());
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
changes = db.parse(is);
changes.getDocumentElement().normalize();
// Searching AUTHKEY in created document
NodeList root = changes.getElementsByTagName("Auth");
Element myRoot = (Element) root.item(0);
errorCode = myRoot.getAttribute("ErrorCode");
auth = myRoot.getAttribute("Key");
} catch (IOException e) {
errorCode = null;
} catch (ParserConfigurationException e) {
errorCode = null;
} catch (SAXException e) {
errorCode = null;
} catch (Exception e) {
errorCode = null;
}
...
我希望你会发现每一个有用的链接
编辑
在MainActivity中添加以下内容(当然,在更改代码之后):
感谢各位的回答,这些答案和其他资源一起帮助我找到了问题的解决方案
基本上,我需要用XML文件构建一个数据库,然后将该数据库导出到另一个项目中;这样,我就不需要直接将XML与我的最终应用程序一起发布,也不必担心在廉价智能手机上运行时,XML中的数据库填充会挂起
也就是说,让我们深入挖掘对我有用的代码:)
在我的主布局中,我创建了一个ID为“createButton”的按钮
main.xml
Dbhelper.java
为什么不把它们放在类中而不是XML中呢=/因为XML对我来说更容易创建;数据是使用PHPmyAdmin从WordPress数据库“wp posts”表中提取的。该数据库包含4000多条记录,并且每天都在更新,如果将这些记录插入一个类中,则无法对其进行跟踪。@numediaweb是否所有数据都来自web?那么问题出在哪里?你有什么错误吗?或者记录没有插入数据库?很抱歉没有这么清楚!我的问题是如何在我的活动中实现这一点?换句话说,我如何通过在Eclipse上启动这个应用程序/代码来创建这个数据库?谢谢:)谢谢@Yume117我已经看过那个教程了。但发现它过于笼统和冗长,无法遵循:(…上面的代码没有集成到我的主应用程序中;这只是为了创建一个sqlite.db文件,我将它包含在我的真实应用程序中!建议:我认为你应该将你的SQLDataBaseHelper和你的XmlParser分为两个不同的类。sql helper应该只做数据库操作,并且仅此而已。请保持简单,因为不太清楚!我的问题是em是如何在我的活动中实现这一点的?换句话说,我如何通过在Eclipse上启动此应用程序/代码来创建此数据库?我是Java/Android SDK的新手..谢谢:)在我的帖子中,构造函数“DatabaseOpenHelper”为您创建database.db(调用onCreate,您可以通过简单的sql请求创建表)。如果版本号与现有数据库相同,它将尝试更新它(调用onUpdate,您可以在其中执行任何操作。更新或删除数据库)因为我迷路了,所以有任何这样的工作示例!你能告诉我在上面的活动代码中我可以在哪里调用DatabaseOpenHelper吗?或者它会在应用程序启动后自动调用吗?但是如何在我的MainActivity中调用XMLtoSQLite?感谢JaAd的回答,但如上所述,我的问题不是如何解析XML或如何与DB对话或如何获取数据来自web的数据,但这是一个非常简单的问题;如何在我的主要活动中实现所有这些。换句话说,我找到的所有教程都解释了如何创建一个与DB对话的类,或者一个关于如何从XML源填充数据库的教程。但是对于我这个初学者,我不知道如何从我的应用程序的主要活动中调用这些类-如何利用这些类,如何告诉他们;为我填充数据库!
public DatabaseOpenHelper(Context context, CursorFactory factory) {
super(context, DATA_BASE_NAME, factory, DATABASE_VERSION);
}
...
String errorCode = null;
Document changes;
try {
// URL were lies some xml-data
URL url = new URL(params[0]);
// Creating a document
InputSource is = new InputSource(url.openStream());
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
changes = db.parse(is);
changes.getDocumentElement().normalize();
// Searching AUTHKEY in created document
NodeList root = changes.getElementsByTagName("Auth");
Element myRoot = (Element) root.item(0);
errorCode = myRoot.getAttribute("ErrorCode");
auth = myRoot.getAttribute("Key");
} catch (IOException e) {
errorCode = null;
} catch (ParserConfigurationException e) {
errorCode = null;
} catch (SAXException e) {
errorCode = null;
} catch (Exception e) {
errorCode = null;
}
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String url = "http://myUrlWhereDataIsStored.com";
// Creating database
MyDatabase database = new MyDatabase(this);
// Populating database
new MyAsyncTask().execute(url);
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".XMLtoDB" >
<Button
android:id="@+id/createButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/create_database" />
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/createButton" />
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button createbtn = (Button) findViewById(R.id.createButton);
createbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = new DbHelper(getApplicationContext()).getWritableDatabase();
if (db != null) {
Toast.makeText(XMLtoDB.this, "Database is created!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(XMLtoDB.this, "Error creating database!", Toast.LENGTH_SHORT).show();
}
}
});
}
/*
* How to extract the generated DataBase in DDMS?
* First of all, delete the old database by going to the emulator app amanger
* then clear cash.
* Then in DDMS re-select the device in the left pane. For some reasons,
* it needs to be refreshed and the previous selection is invalid.
* */
package com.np.amawalandroid.db;
import java.io.IOException;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import com.np.amawalandroid.xml.XMLParser;
import com.np.amawalandroid.xml.XMLParserObject;
public class DbHelper extends SQLiteOpenHelper implements BaseColumns {
public static final String DB_TEST = "amawal.sqlite";
public static final String TABLE_NAME = "wp_posts";
public static final String ID = "ID";
public static final String post_content = "post_content";
public static final String post_title = "post_title";
private static Context mContext;
List<XMLParserObject> posts = null;
public DbHelper(Context context) {
super(context, DB_TEST, null, 1);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + ID + " INTEGER, " + post_content + " TEXT, "
+ post_title + " TEXT);");
// Insert data from XML
XMLParser parser = new XMLParser();
try {
posts = parser.parse(mContext.getAssets().open("wp_posts.xml"));
for (XMLParserObject post : posts) {
//Toast.makeText(mContext, post.getpostTitle(), Toast.LENGTH_SHORT).show();
ContentValues values = new ContentValues();
values.put(ID, post.getId());
values.put(post_content, post.getPostContent());
values.put(post_title, post.getpostTitle());
db.insert(TABLE_NAME, ID, values);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
<?xml version="1.0" encoding="utf-8"?>
<pma_xml_export version="1.0" xmlns:pma="http://www.phpmyadmin.net/some_doc_url/">
<database name="npma_amawal">
<table name="wp_posts">
<column name="ID">46</column>
<column name="post_content">adlis g llan iwaliwn</column>
<column name="post_title">amawal</column>
</table>
package com.np.amawalandroid.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class XMLParser {
List<XMLParserObject> posts;
private XMLParserObject post_ref;
public XMLParser() {
posts = new ArrayList<XMLParserObject>();
}
public List<XMLParserObject> parse(InputStream is) {
XmlPullParserFactory factory = null;
XmlPullParser parser = null;
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
parser = factory.newPullParser();
parser.setInput(is, null);
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
// System.out.println("=======" + tagname + "============");
switch (eventType) {
case XmlPullParser.START_TAG:
// if <table> create a new instance of post
if (tagname.equalsIgnoreCase("table")) {
post_ref = new XMLParserObject();
}
// if <column>
if (tagname.equalsIgnoreCase("column")) {
if (parser.getAttributeValue(null, "name").equalsIgnoreCase("ID")) {
// System.out.println("ID found! ");
post_ref.setId(Integer.parseInt(parser.nextText()));
} else if (parser.getAttributeValue(null, "name").equalsIgnoreCase("post_content")) {
// System.out.println("post_content found! ");
post_ref.setPostContent(parser.nextText());
} else if (parser.getAttributeValue(null, "name").equalsIgnoreCase("post_title")) {
// System.out.println("post_title found! ");
post_ref.setpostTitle(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("table")) {
posts.add(post_ref);
// System.out.println("Posts so far " + post_ref);
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return posts;
}
}
public class XMLParserObject {
private int ID;
private String post_title;
private String post_content;
public int getId() {
return ID;
}
public void setId(int ID) {
this.ID = ID;
}
public String getpostTitle() {
return post_title;
}
public void setpostTitle(String post_title) {
this.post_title = post_title;
}
public String getPostContent() {
return post_content;
}
public void setPostContent(String post_content) {
this.post_content = post_content;
}
@Override
public String toString() {
return ID + ": " + post_title + "\n" + post_content;
}
}