Android 使用XML填充SQLite并集成内部活动

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

从我找到的所有教程(包括Stackoverflow中的答案)中,我找不到一个完整的教程来展示如何实现XML到SQLite的填充。 我创建了一个DB助手,但我不知道如何将其集成到我的活动中。我想做的是;一旦应用程序启动,它就应该用XML填充数据库

XML 我在“res\XML”文件夹中有一个XML文件“amawal\u posts.XML”,其中包含一些我想在数据库中填充的条目

<?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;
    }
}